4

TomEE 7.0.1 と Jackson 2 を JAX-RS JSON プロバイダー (で構成openejb-jar.xml) として使用しています。json を jax-rs サービスにポストすることは完全にうまく機能し、jackson アノテーションを使用します。

しかし、JAX-RS クライアント (または cxf webclient) を使用すると、Jackson を Webclient.create メソッドに提供したとしても、常に Johnzon が使用されます。いくつかのデバッグの後、TomEE が何らかの形でクライアント ファクトリに Johnzon を追加し、json 用の他のメッセージ ボディ パーサーを使用できないことを確認しました。

これは TomEE CXF 統合のバグですか、それとも何か見落としがありますか?

4

1 に答える 1

10

Johnzon はデフォルトでバスに登録され、デフォルトの JSON (マッピング) および JSON-P プロバイダーを持ちます。CXF は、バス プロバイダーの優先順位をアプリケーション (クライアント API の register()) よりも低くするのに十分賢いので、register を呼び出すと、jackson を使用することが期待されます...それでも johnzon を使用します。

これは完全に正常であり、次の 2 つの理由によります。

  1. JAX-RS仕様の優先度定義
  2. ジャクソン消費/生産の定義

要約すると (1) より具体的に言うと、プロバイダは優先度が高いため、" / " プロバイダよりも "application/json" プロバイダが優先されます。

問題を回避するために、Johnzon は「application/json」を使用します。ただし、jackson はカスタム マッチング戦略を使用するため、" / " を使用します。したがって、メディアタイプの優先度は、johnzon が json に対して jackson よりも「より適応している」と言うのに十分であるため、バスの優先度は無視されます。

これを解決する最も簡単な方法は、jackson プロバイダーをオーバーライドし (拡張するだけ)、ワイルドカードの代わりに@Provides/@Consumesで装飾することです。MediaType.APPLICATION_JSON

于 2016-08-12T10:04:32.820 に答える