【问题标题】:JAXB / EclipseLink : unmap a type dynamicallyJAXB / EclipseLink:动态取消映射类型
【发布时间】:2012-04-14 01:19:09
【问题描述】:

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

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

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

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

如果我很好理解,MOXy Extensible Models - Refresh http://blog.bdoughan.com/2011/06/moxy-extensible-models-refresh-example.html 能够做到这一点,但这里有人知道实现此功能的更简单方法吗?

【问题讨论】:

    标签: java xml jaxb eclipselink moxy


    【解决方案1】:

    注意:我是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

    可扩展模型

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

    【讨论】:

    • 感谢您的回答。但是我不明白如何在现有模型上使用映射文件。实际上最好的方法是拥有模型(经典的 JPA 实体),然后使用映射文件修剪模型。但是当我测试它时,没有考虑映射文件。即使使用 JAXBHelper.getJAXBContext(jc).refeshMetadata();
    • @njames - 我已经用你可以使用的策略更新了我的答案。我建议对不同级别的映射使用JAXBContext 的不同实例,而不是刷新元数据。
    • 感谢您的明确答复!但是我实际上已经以这种方式工作了。我的问题是:由于我有一个带有注释类的现有 JPA/JAXB 模型,有没有办法使用映射文件来“覆盖”现有模型?我担心的是我无法更改模型(也无法删除注释以仅使用映射文件)
    • @njames - 是的,外部映射文档具有完全覆盖注释的功能。这是一个示例:blog.bdoughan.com/2011/09/…
    猜你喜欢
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 2021-12-24
    • 2019-02-09
    • 1970-01-01
    相关资源
    最近更新 更多