如何在 TomEE 7 中使用 Jackson 作为 JAX-RS-Client 的 JSON 提供者而不是 Johnzon?
How to use Jackson as JSON provider for JAX-RS-Client instead of Johnzon in 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 集成的错误还是我错过了什么?
Johnzon 默认在总线上注册,具有默认的 JSON(映射)和 JSON-P 提供程序。 CXF 足够聪明,可以使总线提供程序的优先级低于应用程序提供程序(客户端的 register() API),因此如果您调用 register,您希望使用 jackson ......并且仍然使用 johnzon - 我怀疑它是万一你中了。
这是完全正常的,原因有两点:
- JAX-RS 规范优先级定义
- 杰克逊Consumes/Produce定义
总而言之,(1) 表示更具体的是提供者的优先级更高,因此 "application/json" 提供者将优先选择“/”提供者.
为了避免问题,Johnzon 使用 "application/json"。然而,杰克逊使用自定义匹配策略,因此使用“/”。因此总线优先级被忽略,因为媒体类型优先级足以说明 johnzon 是 "more adapted" 而不是 jackson json.
要解决它,最简单的方法可能是覆盖 jackson 提供程序(只是扩展它)并用 @Provides
/@Consumes
和 MediaType.APPLICATION_JSON
而不是通配符装饰它。
我使用 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 集成的错误还是我错过了什么?
Johnzon 默认在总线上注册,具有默认的 JSON(映射)和 JSON-P 提供程序。 CXF 足够聪明,可以使总线提供程序的优先级低于应用程序提供程序(客户端的 register() API),因此如果您调用 register,您希望使用 jackson ......并且仍然使用 johnzon - 我怀疑它是万一你中了。
这是完全正常的,原因有两点:
- JAX-RS 规范优先级定义
- 杰克逊Consumes/Produce定义
总而言之,(1) 表示更具体的是提供者的优先级更高,因此 "application/json" 提供者将优先选择“/”提供者.
为了避免问题,Johnzon 使用 "application/json"。然而,杰克逊使用自定义匹配策略,因此使用“/”。因此总线优先级被忽略,因为媒体类型优先级足以说明 johnzon 是 "more adapted" 而不是 jackson json.
要解决它,最简单的方法可能是覆盖 jackson 提供程序(只是扩展它)并用 @Provides
/@Consumes
和 MediaType.APPLICATION_JSON
而不是通配符装饰它。