Jersey(2.10.4)实体提供者选择算法对自定义提供者(MessageBodyWriter)的优先级较低,使其不被



我们的应用程序中有一个自定义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=真正的

最新更新