JAXB / EclipseLink:动态取消映射类型

时间:2012-03-30 10:51:42

标签: java xml jaxb eclipselink moxy

我有一项服务应该能够在不同级别的详细信息或不同的详细模式下提供“用户配置文件”。

这些用户配置文件在数据库中与JPA2同步,一切正常。 使用MOXy(EclipseLink)我还在XML中序列化了配置文件,所有这些都在这里工作正常。

但是,详细模式(BRIEF,SUMMARY,FULL)是通过XML中序列化的用户配置文件中特定元素的存在与否来实现的(例如,QueryHistory元素在使用BRIEF verbosity模式时不应序列化) )。

简而言之:我想指定一个JAXBContext,一些元素不能被序列化,我想在运行时指定它

如果我很好理解,MOXy可扩展模型 - 刷新http://blog.bdoughan.com/2011/06/moxy-extensible-models-refresh-example.html能够做到这一点,但是有人在这里知道一种更简单的方法来实现这个功能吗?

1 个答案:

答案 0 :(得分:2)

注意:我是EclipseLink JAXB (MOXy)主管,是JAXB 2 (JSR-222)专家组的成员。

为了支持对数据的不同视图的概念,我建议使用JAXBContext的不同实例来表示每个映射:BRIEF,SUMMARY,FULL。 MOXy允许您通过利用其external mapping document来将多个映射应用于域模型。

<强>策略

  1. 用于映射完整模型和使用XML元数据来减少的注释 映射
  2. 用于映射最小模型和使用XML元数据的注释 扩展映射
  3. 示例代码

    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中扩展映射元数据的能力针对的是希望在不关闭正在运行的应用程序的情况下对元数据进行更改的开发人员。这方面的一个例子是支持在线调查的域模型,需要对其进行增强以支持新问题。