我们的应用程序中有一个自定义的MessageBodyWriter,它生成Media类型application / xml的数据。我们知道Jersey 2.x有一个算法(https://jersey.java.net/documentation/latest/message-body-workers.html#mbw.writer.selection.algorithm)从内部和自定义列表中选择合适的MBR MessageBodyWriters将实体持久化到输出缓冲区。算法排序MBR基于对象类型距离和媒体类型距离。所以我们的自定义MBR没有被调用,因为我们在Jersey公共代码(MessageBodyFactory.getMessageBodyWriter())中看到我们的自定义编写器在列表的下方和一些其他提供者,其isWriteable()方法返回true被调用。
问题是我们如何强制Jersey调用自定义MessageBodyWriters?我们应该尝试添加自定义媒体类型(如application / vnd.xml)来强制它调用自定义类型吗?
答案 0 :(得分:0)
我可以通过在我的web.xml文件中将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>
来实现此目的:
[md-form]
[md-text label="House no."]
[text* house-name]
[/md-text]
[md-text label="Street no."]
[text* street-name]
[/md-text]
[md-text label="Post Ofiice"]
[text* po-name]
[/md-text]
[/md-form]
来自docs:
JAX-RS 2.0在实体提供商选择算法的一个步骤中与JAX-RS 1.x不兼容。 JAX-RS 1.x以完全相反的顺序定义步骤4中的排序键优先级。因此,在JAX-RS 1.x中,密钥按以下顺序定义:主要媒体类型,辅助类型声明距离,其中自定义提供者始终优先于内部提供者。如果要强制Jersey使用与JAX-RS 1.x兼容的算法,请设置属性(到ResourceConfig或从其getProperties方法返回Application):
jersey.config.workers.legacyOrdering =真