我有一项服务应该能够在不同的详细程度或不同的详细模式下提供“用户配置文件”。
这些用户配置文件在数据库中与 JPA2 同步,一切正常。 使用 MOXy (EclipseLink),我还在 XML 中序列化配置文件,并且这里一切都工作正常。
但是,详细模式(BRIEF、SUMMARY、FULL)是通过 XML 中序列化的用户配置文件中是否存在特定元素来实现的(例如,在使用 Brief 详细模式时不应序列化元素 QueryHistory) )。
简而言之:我想向 JAXBContext 指定某些元素不得序列化,并且我想在运行时指定它。
如果我很好理解的话,MOXy 可扩展模型 - 刷新 http://blog.bdoughan.com/2011/06/moxy-extensible-models-refresh-example.html能够做到这一点,但是这里有人知道实现此功能的更简单的方法吗?
最佳答案
注意:我是EclipseLink JAXB (MOXy) JAXB 2 (JSR-222) 的领导者和成员专家组。
为了支持数据的不同 View 的概念,我建议使用不同的 JAXBContext
实例来表示每个映射:BRIEF、SUMMARY、FULL。 MOXy 允许您利用其 external mapping document 将多个映射应用到域模型。 .
策略
- 用于映射完整模型的注释并使用 XML 元数据来减少 映射
- 用于映射最小模型并使用 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
。
可扩展模型
在 MOXy 中扩展映射元数据的功能面向希望在不关闭正在运行的应用程序的情况下更改元数据的开发人员。一个例子是支持在线调查的域模型,需要对其进行增强以支持新问题。
关于java - JAXB/EclipseLink : unmap a type dynamically,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9941557/