首页 文章

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

提问于
浏览
3

我使用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 回答

  • 7

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

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

    • JAX-RS规范优先级定义

    • Jackson 消费/制作定义

    总结一下(1)说更具体的是提供商更高的是它的优先级,所以一个"application/json"提供者将被支持一个“/”的提供者 .

    为了避免问题,Johnzon使用"application/json" . 然而 Jackson 使用自定义匹配策略,因此使用“/ ". So the bus priority is ignored since mediatype priority is enough to say johnzon is "更适应” Jackson 为json .

    为了解决这个问题,最简单的方法是覆盖jackson提供程序(只需扩展它)并用 @Provides / @ConsumesMediaType.APPLICATION_JSON 而不是通配符来装饰它 .

相关问题