2012-03-30 81 views
2

我有一個服務應該能夠在不同級別的細節或不同冗長模式下提供「用戶配置文件」。JAXB/EclipseLink:動態取消映射類型

這些用戶配置文件在數據庫中與JPA2同步,並且所有工作都正常。 使用MOXy(EclipseLink)我也在XML中序列化配置文件,並且在這裏也一切正常。但是,冗長模式(BRIEF,SUMMARY,FULL)是通過在XML中序列化的用戶配置文件中存在或不存在特定的元素來實現的(例如,元素QueryHistory,在使用簡要的詳細程度時不應該被序列化模式)。

簡言之:我想指定一個JAXBContext,一些元素不能被序列化,我想在運行時指定它

如果我很好理解,MOXy可擴展模型 - 刷新http://blog.bdoughan.com/2011/06/moxy-extensible-models-refresh-example.html是能夠做到這一點,但是這裏有人知道一個更簡單的方法來實現這個功能嗎?

回答

2

備註:我是EclipseLink JAXB (MOXy)的領導者和JAXB 2 (JSR-222)專家組的成員。

爲了支持您的數據的不同視圖的概念,我會建議有一個JAXBContext的不同實例來表示每個映射:BRIEF,SUMMARY,FULL。 MOXy允許您通過利用其external mapping document將多個映射應用於域模型。

策略

  1. 批註映射完整的模型,並使用XML元數據,以減少 映射
  2. 批註映射最小模型,並使用XML元數據來 擴展映射

示例代碼

JAXBContext的三個實例構建於同一類(UserProfile)上,但具有由MOXy的外部映射文檔控制的不同映射。

JAXBContext briefContext = JAXBContext.newInstance(UserProfile.class); 

Map<String, Object> summaryProperties = new HashMap<String, Object>(1); 
summaryProperties.put("eclipselink-oxm-xml", "summaryMapping.xml"); 
JAXBContext summaryContext = JAXBContext.newInstance(new Class[] {UserProfile.class}, summaryProperties); 

List<String> fullMappingXMLs = new ArrayList(2); 
fullMappingXMLs.add("summaryMapping.xml"); 
fullMappingXMLs.add("fullMapping.xml"); 
Map<String, Object> fullProperties = new HashMap<String, Object>(1); 
fullProperties.put("eclipselink-oxm-xml", fullMappingXMLs); 
JAXBContext fullContext = JAXBContext.newInstance(new Class[] {UserProfile.class}, fullProperties); 

下面是一個演示如何從多個映射文檔引導JAXBContext的示例。

擴展模式

在莫西擴展映射元數據的能力是針對開發人員希望做而不必關閉正在運行的應用程序更改了元數據。這方面的一個例子是支持在線調查的領域模型,需要加強以支持一個新問題。

+0

謝謝你的答案。但是我不明白如何在我現有的模型上使用映射文件。實際上最好的可能是擁有模型(經典的JPA實體),然後使用映射文件修剪模型。但是當我測試它時,映射文件並沒有被考慮在內。即使使用JAXBHelper.getJAXBContext(jc).refeshMetadata(); – njames 2012-04-10 12:23:29

+0

@njames - 我已經用可以使用的策略更新了我的答案。我建議爲不同級別的映射使用「JAXBContext」的不同實例,而不是刷新元數據。 – 2012-04-10 13:28:35

+0

感謝您的明確答覆!不過,我已經這樣做了。我的問題是:因爲我有一個帶有註釋類的現有JPA/JAXB模型,有沒有辦法使用映射文件來「覆蓋」現有模型?我的擔心是我無法更改爲模型(也沒有刪除註釋以僅使用映射文件) – njames 2012-04-10 13:39:24