私はJerseyを使ってサービスにREST APIを構築しています。私はJSONとXMLの両方を受け入れて返すことができたいと思いますが、これは主に動作しますが、Jerseyが吐き出したいJSONのデフォルトの「マップされた」フレーバーが気に入らないのです。JerseyにNatural JSON表記をグローバルに/デフォルトとして使用させることはできますか?
私は(それがデフォルトとの明白な問題は、表記を「マッピング」になるので、私は長さで引用しますから、)新しい「自然」の表記について知っている:
を維持し、どこでもそれを使用したいJSONのように、XML属性で を気にする必要はありませんが、私はどのように理解することができませんでした。私は、サーブレット/サーブレットクラス/ init-paramタグを使った通常のダンスだと思うものを使って、TomcatのXML設定ファイルを使ってJerseyをインスタンス化/設定していますが、それがどういうものなのか、そこからJSONConfigurationオプションを指定することが可能です。マッピングされたJSON表記を使用した後、しばらくの間、明らかに、 は、手作業でさまざまなものをすべて構成する必要があります。 に問題があります。この手動作業を避けるため、Jerseyバージョン1.0.2では、新しい自然なJSON表記 が導入されました。自然な表記で、ジャージー は、個々のアイテムの処理方法を自動的に把握して、 を手動で処理する必要はありません。 を手動で設定する必要はありません。 Java配列とリストはJSON配列にマップされます。単一要素の場合は さえあります。 Javaの番号とブール値が正しく JSON番号と真偽値にマッピングされ、そしてあなたは、彼らが元の名前
私はJSONJAXBContextをJavaコードからインスタンス化し、JSONConfiguration.natural()を適用することができる独自のContextResolverを実装しようとしました(この例はthis answerのように見えます)。これは機能しますが、そのコードで明示的にリストする型に対してのみ、JSONJAXBContextコンストラクタに渡します。この余分なコードは書いて維持するだけでなく、データクラスを追加すると変更されますが、Listなどの場合は機能しません。
ジャージーにマップ表記の代わりに自然表記を使用するように指示する方法はありますか?
web.xmlの "com.sun.jersey.api.json.POJomappingFeature"をtrueに設定し、プロジェクトにjacksonライブラリを含めましたか?私はそれを試みたが、何も変わらなかった。私が見つけた唯一の解決策は、ContextResolverを作成し、それをApplicationサブクラスに登録することです(@Providerアノテーションによって自動的に検出されませんでした)。そしてContextResolver内のすべてのクラスをリストします。私。あなたがあなたの質問にすでに説明した解決策と、あなたが好きではなかったこと。あなたはおそらく、問題をどのように解決したか、より詳細な情報を提供できますか? – Dominique