Jersey + Moxy + JAXB - 如何在没有注释的情况下编组XML

时间:2014-06-13 07:32:35

标签: jaxb jersey moxy

http://blog.bdoughan.com/2013/06/moxy-is-new-default-json-binding.html大约一半的地方,标题为#34;自定义JSON-Binding"。您如何类似地自定义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,然后调用任何已注册的ContextResolvers。它没有为XML注册等效的MessageBodyWriter,而Jersey的默认MBW似乎完全忽略了已注册的ContextResolvers。

但是,从文档中完全缺少创建自定义MessageBodyWriter的需要,而且几乎每个例子都表明我错过了一些基本的东西。

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

编辑:回复评论的更多信息:

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

要让Jersey选择MOXy作为JAXB提供程序,您只需要在与域模型相同的程序包中添加jaxb.properties文件,其中包含正确的条目(请参阅:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)。对于JAX-RS,如果未指定ContextResolver,则此包需要是与参数相对应的包,或者从使用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
  3. 对于ContextResolver,您可以使用代码直接创建MOXy JAXBContext,而不是利用jaxb.properites文件。请参阅我在下面链接的答案中的选项#2:

答案 1 :(得分:1)

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

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

有关完整工作的示例,请参阅http://lagod.id.au/blog/?p=472

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