Jersey(2.10.4)实体提供程序选择算法给予自定义提供程序(MessageBodyWriter)较低的优先级,使其不被调用

时间:2015-02-17 13:09:14

标签: jersey-2.0 jersey-client

我们的应用程序中有一个自定义的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)来强制它调用自定义类型吗?

1 个答案:

答案 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 =真