2012-01-25 5 views
4

私はJerseyを使ってサービスにREST APIを構築しています。私はJSONとXMLの両方を受け入れて返すことができたいと思いますが、これは主に動作しますが、Jerseyが吐き出したいJSONのデフォルトの「マップされた」フレーバーが気に入らないのです。JerseyにNatural JSON表記をグローバルに/デフォルトとして使用させることはできますか?

私は(それがデフォルトとの明白な問題は、表記を「マッピング」になるので、私は長さで引用しますから、)新しい「自然」の表記について知っている:

マッピングされたJSON表記を使用した後、しばらくの間、明らかに、 は、手作業でさまざまなものをすべて構成する必要があります。 に問題があります。この手動作業を避けるため、Jerseyバージョン1.0.2では、新しい自然なJSON表記 が導入されました。自然な表記で、ジャージー は、個々のアイテムの処理方法を自動的に把握して、 を手動で処理する必要はありません。 を手動で設定する必要はありません。 Java配列とリストはJSON配列にマップされます。単一要素の場合は さえあります。 Javaの番号とブール値が正しく JSON番号と真偽値にマッピングされ、そしてあなたは、彼らが元の名前

を維持し、どこでもそれを使用したいJSONのように、XML属性で を気にする必要はありませんが、私はどのように理解することができませんでした。私は、サーブレット/サーブレットクラス/ init-paramタグを使った通常のダンスだと思うものを使って、TomcatのXML設定ファイルを使ってJerseyをインスタンス化/設定していますが、それがどういうものなのか、そこからJSONConfigurationオプションを指定することが可能です。

私はJSONJAXBContextをJavaコードからインスタンス化し、JSONConfiguration.natural()を適用することができる独自のContextResolverを実装しようとしました(この例はthis answerのように見えます)。これは機能しますが、そのコードで明示的にリストする型に対してのみ、JSONJAXBContextコンストラクタに渡します。この余分なコードは書いて維持するだけでなく、データクラスを追加すると変更されますが、Listなどの場合は機能しません。

ジャージーにマップ表記の代わりに自然表記を使用するように指示する方法はありますか?

答えて

5

私はここに求めていた実際の質問に対する答えを見つけることはなかったが、代わりに私が欲しかった同じ最終結果を達成シンプルな3ステップのプロセスを発見した:

  • は、私のプロジェクトにJacksonを追加
  • 有効にするようにジャージーを設定するFEATURE_POJO_MAPPING
  • とても簡単であることが判明したので、頭を何度か叩いてください。

ザ・ジャージーのドキュメントは、(それは私が疑問にリンクドキュメントのページの最初の例です)目立つこのPOJOMappingFeature/FEATURE_POJO_MAPPINGに言及し、それが意味を正確に何を説明していませんし、道からそれた文書は、その情報を提示します私はこのオプション(5.1、 "POJOサポート")が、私が望んでいたよりも似ているオプション5.2( "JAXBベースのJSONサポート")と拮抗していると思いました。 FEATURE_POJO_MAPPINGを有効にする前に、他の多くのことを試しました。

しかし、いったん試してみると、それは私が欲しかったものとまったく同じように機能し、私は振り返る必要はありませんでした。

これは、JerseyのネイティブJSON処理の実装と比較して、クライアントがJSONコンテンツを偽装した場合に、より優れたエラーメッセージを生成することです。

+0

web.xmlの "com.sun.jersey.api.json.POJomappingFeature"をtrueに設定し、プロジェクトにjacksonライブラリを含めましたか?私はそれを試みたが、何も変わらなかった。私が見つけた唯一の解決策は、ContextResolverを作成し、それをApplicationサブクラスに登録することです(@Providerアノテーションによって自動的に検出されませんでした)。そしてContextResolver内のすべてのクラスをリストします。私。あなたがあなたの質問にすでに説明した解決策と、あなたが好きではなかったこと。あなたはおそらく、問題をどのように解決したか、より詳細な情報を提供できますか? – Dominique

関連する問題