2016-08-11 3 views
3

ジャクソン2とTomEE 7.0.1をJAX-RS JSONプロバイダ(openejb-jar.xmlで設定)として使用します。 json-rsサービスへのjsonの投稿は、完璧に機能し、jacksonアノテーションを使用します。TomEE 7のJohnzonの代わりにJAX-RS-ClientのJSONプロバイダとしてJacksonを使用するにはどうすればいいですか?

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

これはTomEE CXFとの統合のバグですか、何か迷っていますか?

+0

jacksonさんをどのように追加しましたか? 'client.register(com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider.class); ' – ulab

答えて

5

JohnzonはデフォルトでJSON(マッピング)とJSON-Pプロバイダを持つようにバスに登録されています。 CXFはバスプロバイダをアプリケーションより優先度が低い(クライアントAPIのregister())ようにするために賢明です。登録するとジャクソンを使用すると予想されますが、まだジョンジョンソンを使用します - あなたがヒットしたケースです。

完全に正常だと原因に二つのこと

  1. JAX-RS仕様優先度定義
  2. ジャクソン消費し/プロデュース定義

は、要約すると(1)、より具体的であることを言いますプロバイダーの優先度が高いので、「アプリケーション/ json」プロバイダーは「/」の優先権を得ます。

問題を避けるために、Johnzonは "application/json"を使用します。しかし、jacksonはカスタムマッチング戦略を使用しているため、 "/"を使用します。ジャーソンの場合、ジョンソンがジャクソンよりも "適応している"と言うには、メディアタイプの優先順位が十分であるため、バスの優先順位は無視されます。最も簡単にはジャクソンプロバイダを上書き(ちょうどそれを拡張)とMediaType.APPLICATION_JSONの代わりに、ワイルドカード1と@Provides/@Consumesとそれを飾る可能性があり、それを解決するために

+0

Jacksonをオーバーライドし、メディアタイプの選択を絞り込むことは素晴らしいです!ありがとうございました! –

+0

私はちょうど十分にあなたに感謝することはできません、あなたは私が長い時間のデバッグの後、多くの不満から私を救ったソースコード全体! –

関連する問題