【问题标题】:Jersey + Moxy + JAXB - how to marshal XML without annotationsJersey + Moxy + JAXB - 如何在没有注释的情况下编组 XML
【发布时间】:2014-06-13 07:32:34
【问题描述】:

http://blog.bdoughan.com/2013/06/moxy-is-new-default-json-binding.html 大约一半的地方有一个标题“自定义 JSON 绑定”。您如何类似地自定义 XML 绑定?

Jersey 处理 Moxy JSON 绑定的方式与等效的 XML 之间似乎存在根本差异。如果我按照 Jersey 文档中的说明创建自定义 JAXBContext 解析器来配置 Moxy 的映射文件,则该解析器会在 JSON 情况下触发,但不会在 XML 情况下触发。请参阅 https://bitbucket.org/jmetcher/resttest/ 了解一个非常小的项目来展示这一点。

我有正确的 jaxb.properties 文件,并且正在使用 jersey-media-moxy 模块进行构建。我可以让相同的 Moxy JAXB 设置在独立模式下工作,但我无法让 Jersey 注意到它。

我所做的调试表明,让它工作的唯一方法是创建一个自定义 MessageBodyWriter。 jersey-media-moxy 模块注册一个 JSON MessageBodyWriter,然后它将调用任何注册的 ContextResolver。它没有为 XML 注册等效的 MessageBodyWriter,而且 Jersey 的默认 MBW 似乎完全忽略了注册的 ContextResolvers。

但是,文档中完全缺少创建自定义 MessageBodyWriter 的需要,几乎每个示例似乎都表明我缺少一些基本的东西。

我会提供更多信息的链接,但我似乎没有代表在 SO 上做太多事情。

编辑:响应 cmets 的更多信息:

Moxy 肯定会被选为 JAXB 提供者。我可以在调试器中看到这一点。

Jersey 版本是 2.9,EclipseLink 版本是 2.5。 Java 7。

ContextResolver 方法适用于 JSON。在 Application 类中注册 MoxyXMLFeature 的方法也是如此。在这两种情况下,都会使用使用正确映射文件配置的正确上下文。在 XML 案例中,Jersey 似乎从未尝试创建上下文。

但是,如果我向我要编组的类添加了一个 @XmlRootElement 注释,则一切正常。即使没有其他注释,也可以根据 oxm 映射文件将类编组为 XML 和 JSON。我已经更新了 bitbucket 项目来展示这一点。

因此,我可以通过创建自定义 MBW 或提供带注释的根类来解决此问题。我想此时我要弄清楚最好或推荐的方法是什么,以便我可以记录文档补丁。

【问题讨论】:

    标签: jaxb jersey moxy


    【解决方案1】:

    要让 Jersey 选择 MOXy 作为 JAXB 提供程序,您只需在与域模型相同的包中添加具有正确条目的 jaxb.properties 文件(请参阅:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)。在 JAX-RS 的情况下,如果未指定 ContextResolver,则此包需要是对应于参数 to 的包,或者是与 JAX-RS 注释映射的服务中方法的返回类型相对应的包。

    注意:

    早期版本的 Jersey 中存在一个错误,导致 MOXy 无法被选为默认 JAXB 提供程序,在这种情况下,您可以:

    1. 升级到较新版本的 Jersey。
    2. 创建 ContextResolver 以返回 MOXy 的实例 JAXBContext(请参阅:http://blog.bdoughan.com/2011/04/moxys-xml-metadata-in-jax-rs-service.html

    ContextResolver 的情况下,您可以使用代码直接创建 MOXy JAXBContext 而不是利用jaxb.properites 文件。请参阅我在下面链接的答案中的选项#2:

    【讨论】:

    • 布莱斯,感谢您的回答。手动创建 JAXBContext 可以正常工作 - 您最后一个链接中的选项 #1 和选项 #2。问题在于,在泽西岛,根本不会为完全未注释的类创建 JAXBContext。 Jersey 的默认 XML MBW 似乎预先决定,因为没有注释,它无法处理该类,并且在那里炸弹 - 尽管事实上如果它确实创建了 JAXBContext 一切都会正常工作。
    【解决方案2】:

    确实,使用 Jersey + Moxy 将未注释的域模型编组为 XML 的唯一方法是注册您自己的提供程序(又名 MessageBodyWriter/MessageBodyReader)。

    Moxy 功能支持编组未注释的模型。然而,Jersey 的默认 JAXB 提供程序通过要求模型在将控制权交给 Moxy 之前进行注释来掩盖此功能。 JSON case 的实现方式不同,没有这个限制。

    请参阅 http://lagod.id.au/blog/?p=472 了解完整的示例。

    报告的文档错误:https://java.net/jira/browse/JERSEY-2552

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-03
      • 2016-12-04
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-13
      • 1970-01-01
      相关资源
      最近更新 更多