4

我使用 TomEE 7.0.1 和 Jackson 2 作为 JAX-RS JSON 提供程序(在 中配置openejb-jar.xml)。将 json 发布到 jax-rs 服务效果很好,并且使用了 jackson 注释。

但是即使我将 Jackson 提供给 Webclient.create 方法,使用 JAX-RS 客户端(或 cxf webclient)总是使用 Johnzon。经过一些调试后,我确信 TomEE 以某种方式将 Johnzon 添加到客户端工厂,并且无法使用其他用于 json 的消息正文解析器。

这是 TomEE CXF 集成的错误还是我错过了什么?

4

1 回答 1

10

默认情况下,Johnzon 在总线上注册为具有默认 JSON(映射)和 JSON-P 提供程序。CXF 足够聪明,可以使总线提供商的优先级低于应用程序的优先级(用于客户端 API 的 register()),因此如果您调用 register ,您希望使用 jackson ......并且仍然使用 johnzon - 我怀疑这是您遇到的情况。

这是完全正常的,原因有两点:

  1. JAX-RS 规范优先级定义
  2. 杰克逊消费/生产定义

总结(1)说更具体的是提供者的优先级更高,因此“应用程序/json”提供者将被授予“/”提供者的特权

为了避免问题,Johnzon 使用“application/json”。然而杰克逊使用自定义匹配策略,因此使用“ / ”。因此,总线优先级被忽略,因为媒体类型优先级足以说明 johnzon 比 json 的杰克逊“更适应”。

要解决它,最简单的方法可能是覆盖杰克逊提供者(只是扩展它)并用@Provides/@ConsumesMediaType.APPLICATION_JSON不是通配符来装饰它。

于 2016-08-12T10:04:32.820 回答