2013-07-24 59 views
1

我在將XML節點轉換爲JPA實體的任務之前。 XML中的對象與實體所代表的類似,但不完全相同。看起來我會有很多轉換代碼。轉換頭疼

XML在Schema .xsd文件中定義,我使用JAXB生成類和創建實例。上面的決定不是觸及生成的類型。我會爲他們每個人創建轉換器,也許我會按照訪問者模式去做,還不知道。

讓我感到困擾的是有人決定改變.xsd文件並且不會更新可靠的轉換器。

我的想法是讓這些轉換器類保持來自代碼中處理的適當JAXB類的字段的靜態最終列表。如果有人在.xsd文件中修改它們,則會記錄一些警告,表明某些字段尚未處理,或者某些處理字段不再存在。

此外,我想確保轉換器的數量與JAXB生成的類的數量相匹配。 如何做到這一點?

也許我應該以某種方式檢查執行時間可以從.xsd文件生成哪些類並將它們與已註冊的轉換器進行比較。我覺得我不能只掃描特定包中的類來檢查JAXB輸出類。

也許訪問者模式可以告訴我哪裏出了問題,但延長檢查可能是一個壞主意,直到在實踐中發生XML-JPA轉換錯誤。

+0

如果您在構建過程中生成類,則在編譯失敗的情況下,如果某個人更改了XSD文件並且未處理字段,應該通知某個可以實現缺少字段的人。沒有簡單的解決方案。 – Phani

+0

他們應該通知,但你永遠不知道他們會不會......雖然,這些預防措施可能會花費我更多的時間,而不是值得的。 – Atom

+0

如果您希望您的XSD獨立於目標Java類進化,我建議不要使用JAXB。相反,您可以讓轉換器使用XPath表達式從知名位置的XML文件中提取數據。如果模式更改,某些路徑可能無效,但XPath不會崩潰,並且可以記錄一些警告消息。 –

回答

0

如果我得到這個權利,你希望有實體註解JAXB註釋,xsd文件和創建映射器xml < - >實體,對吧?或者在XML和實體之間有一些DTO?

我想你可以嘗試在構建期間從Java類創建xsd文件。 然後xml - >使用JAXB編組器可以完成的Java類轉換。 如果您仍然需要知道轉換器的數量是否與Java類的數量相匹配,那麼我會爲此創建集成測試。例如,我需要保留一些命名約定: MyEntity,MyEntityMapper 然後測試將通過實體(dtos?)並搜索映射器。

但也許我沒有正確理解你的問題,請給我提供更多的細節。

+0

不能將xml直接導入實體。 xsd不會生成。 – Atom

+0

由於這個原因,您將保持實體不受JAXB註釋干擾。所以我想我會使用JAXB marshaller進行xml <-> DTO,併爲DTO <->實體創建映射器。仍然保證mappers存在的集成測試。你怎麼看? – Wirus

+0

是的,我想做測試,但我需要以某種方式確定處理類的完整列表。它們是在構建時生成的。我想我需要更深入JAXB,從自己的.xsd文件中獲取該列表。 – Atom