【问题标题】:How to use Jackson as JSON provider for JAX-RS-Client instead of Johnzon in TomEE 7?如何在 TomEE 7 中使用 Jackson 作为 JAX-RS-Client 而不是 Johnzon 的 JSON 提供程序?
【发布时间】:2016-08-11 19:28:35
【问题描述】:

我使用 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 集成的错误还是我遗漏了什么?

【问题讨论】:

  • 你是如何添加 jackson 的? client.register(com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider.class);

标签: java json jackson apache-tomee tomee-7


【解决方案1】:

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

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

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

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

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

要解决这个问题,最简单的方法可能是覆盖 jackson 提供程序(只是扩展它)并用 @Provides/@Consumes 装饰它,用 MediaType.APPLICATION_JSON 而不是通配符之一。

【讨论】:

  • 覆盖 Jackson 并缩小媒体类型选择效果很好!谢谢!
  • 对你的感激之情实在是太感激了,在对整个源代码进行长时间的调试后,你让我免于沮丧!
  • 大家好,我也在努力解决这个问题,但我被困在早期阶段:我在启动时包含了“jackson-databind”和“jackson-jaxrs-json-provider”我收到错误“java.lang.ClassNotFoundException:javax.ws.rs.ext.MessageBodyReader”。任何想法这是什么原因?我使用 TomEE 7.0.5 。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-06-29
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多