我们的应用程序中有一个自定义MessageBodyWriter,它生成媒体类型application/xml的数据。我们知道Jersey 2.x有一个算法(https://jersey.java.net/documentation/latest/message-body-workers.html#mbw.writer.selection.algorithm)从内部和自定义MessageBodyWriters的列表中选择合适的MBR以将实体持久化到输出缓冲区中。该算法根据对象类型距离和媒体类型距离对MBR进行排序。因此,我们的自定义MBR并没有像我们在Jersey公共代码(MessageBodyFactory.getMessageBodyWriter())中看到的那样被调用,我们的定制编写器位于列表的下面,而其他一些提供程序的isWriteable()方法在被调用时返回true。
问题是,我们如何才能强制Jersey调用自定义MessageBodyWriters??我们是否应该尝试添加一个自定义媒体类型(如application/vnd.xml)来强制它调用自定义类型?
我可以通过在web.xml文件中将jersey.config.workers.legacyOrdering
设置为true
来做到这一点
<servlet>
<servlet-name>Jersey</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
...
<init-param>
<param-name>jersey.config.workers.legacyOrdering</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
来自文档:
在实体提供者选择算法的一个步骤中,JAX-RS2.0与JAX-RS1.x不兼容。JAX-RS1.x在步骤4中以完全相反的顺序定义了排序键的优先级。因此,在JAX-RS1.x中,键的定义顺序是:主媒体类型、辅助类型声明距离,其中自定义提供程序始终优先于内部提供程序。如果您想强制Jersey使用与JAX-RS1.x兼容的算法,请设置属性(到ResourceConfig或从应用程序的getProperties方法返回):
jersy.config.workers.legacyOrdering=真正的