如何在TomEE 7中使用Jackson作为JAX-RS-Client的JSON提供者而不是Johnzon?

时间:2016-08-11 19:28:35

标签: java json jackson tomee tomee-7

我将TomEE 7.0.1与Jackson 2一起用作JAX-RS JSON提供程序(在openejb-jar.xml中配置)。将json发布到jax-rs服务非常有效,并使用jackson注释。

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

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

1 个答案:

答案 0 :(得分:8)

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

这完全正常,由于两件事:

  1. JAX-RS规范优先级定义
  2. 杰克逊消费/制作定义
  3. 总结(1)说更具体的是提供商更高的是它的优先级所以" application / json"提供者将受到赞助,而 / "之一。

    为了避免问题,Johnzon使用" application / json"。但杰克逊使用自定义匹配策略,因此使用" / "。因此,总线优先级被忽略,因为mediatype优先级足以说johnzon是"更适应"杰克逊为杰森。

    要解决这个问题,最简单的方法是覆盖杰克逊提供商(只需对其进行扩展)并使用@Provides / @Consumes并使用MediaType.APPLICATION_JSON而不是通配符来装饰它。