2014-06-13 61 views
2

http://blog.bdoughan.com/2013/06/moxy-is-new-default-json-binding.html大约一半的时候有一个标题“自定义JSON绑定”。你如何类似地自定义XML绑定?泽西岛+ Moxy + JAXB - 如何编组没有注释的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似乎完全忽略了注册的ContextResolver。

不管怎样,创建自定义MessageBodyWriter的需求从文档中完全没有,几乎每个示例都似乎表明我缺少一些基本的东西。

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

编辑:在回答更多信息以注释:

莫西肯定是被拾起为JAXB提供商。我可以在调试器中看到这一点。

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

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

但是,如果我将@XmlRootElement注释添加到我试图编组的类中,这一切都可行。即使没有其他注释,根据oxm映射文件,该类可以封送到XML和JSON。我已经更新了bitbucket项目来展示这一点。

因此,我可以通过创建自定义MBW或提供注释的根类来解决此问题。我想在这一点上,我要制定出最好或推荐的方法,以便我可以记录文档补丁。

回答

1

这确实是只有这样,才能使用泽西+莫西是注册元帅的无注明域模型到XML的情况下你自己的提供者(又名MessageBodyWriter/MessageBodyReader)。

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

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

Doc bug报告:https://java.net/jira/browse/JERSEY-2552

1

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

注:

有在新泽西州的早期版本,阻止莫西被拾起作为默认的JAXB提供者,在这种情况下,你可以一个错误:

  1. 升级至更新版本的Jersey。
  2. 创建ContextResolver返回一个莫西JAXBContext的一个实例(参见:http://blog.bdoughan.com/2011/04/moxys-xml-metadata-in-jax-rs-service.html

在的情况下,ContextResolver你可以使用代码直接创建莫西的JAXBContext而不是利用一个jaxb.properites文件。请参阅选项#2我联系下面的回答:

+0

Blaise,谢谢你的回答。手动创建JAXBContext可以正常工作 - 从最后一个链接中选择#1和选项#2。问题是,在泽西岛,JAXBContext根本就没有创建完全没有注解的类。泽西岛的默认XML MBW似乎决定前面,因为没有注释它不能处理类,并在那里炸弹 - 尽管事实上,如果它实际上创建JAXBContext都会正常工作。 – jmetcher