【发布时间】: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 或提供带注释的根类来解决此问题。我想此时我要弄清楚最好或推荐的方法是什么,以便我可以记录文档补丁。
【问题讨论】: