2012-04-04 12 views
4

これはこれまでに回答している必要がありますが、私のGoogleの能力は今日オフになっており、これで少し苦労しています。古いPHPベースからJerseyベースのJVMスタックに移行しています.JVMベースのRESTful APIは、多くのアプリケーションで使用できます。これまでのことはこれまでのところ本当にうまくいっていて、簡単なPOJOからJSONへの変換が大好きです。しかし、我々はクロスドメインJSON要求の難しさに対処しています。私たちは基本的にJSONを返す(@Produces( "application/json")とcom.sun.jersey.api.json.POJOMappingFeatureをtrueに設定した)すべての返答を持っていますが、JSONPをサポートするためには、 JSONWithPaddingのインスタンスこれは当然、@QueryParam( "callback")パラメータを各メソッドに追加する必要もあります。これは、基本的には私たちの努力を複製し、コールバックパラメータがあるかどうかによって同じデータで応答する2つのメソッドが必要になります要求に含まれます。明らかに、これは私たちが望むものではありません。Javaのジャージー、RESTful API、JSONP

私たちは本質的に2つの異なるオプションを試しました。ジャージーには比較的新しいので、私はこの問題が解決されたと確信しています。私はいくつかの場所からリクエストフィルタを書くことができますか、JSONプロバイダを拡張することができます。私の理想的な解決策は、データやロジックレイヤに影響を与えず、代わりに「コールバックパラメータがある場合はコールバックでJSONを囲み、それ以外の場合はJSONを返す」というコードを用意することです。解決策はここにあります: http://jersey.576304.n2.nabble.com/JsonP-without-using-JSONWithPadding-td7015082.html

ただし、この解決策は、デフォルトのJSONプロバイダではなく、Jackson JSONオブジェクトを拡張しています。

ベストプラクティスは何ですか?適切なトラックにいる場合、拡張可能なデフォルトのJSONフィルタのクラスは何ですか?追加の設定が必要ですか?私は完全にオフトラックですか?

答えて

5

すべてのリソースメソッドがJSONWithPaddingオブジェクトを返す場合、Jerseyは要求されたメディアタイプに基づいてJSON(すなわち、それによってラップされたオブジェクトのみ)またはコールバックを返す必要があるかどうかを自動的に判断しますapplication/javascript、application/x-javascript、text/ecmascript、application/ecmascript、またはtext/jscriptのいずれかである場合、Jerseyはコールバックでラップされたオブジェクトを返します。要求されたメディアタイプがapplication/jsonの場合、JerseyはJSONオブジェクトを返します(つまり、コールバックでラップしません)。したがって、この作業を行う1つの方法は、リソースメソッドが上記のすべてのメディアタイプ(application/jsonを含む)を生成し、常にJSONWithPaddingを返し、Jerseyに何をすべきかを決定させることです。これはあなたのために動作しない場合は

、それは(jersey.java.netでユーザーに)あなたのユースケースをカバーしていない理由を私たちに知らせてください。とにかく、その場合はContainerRequest/ResponseFiltersを使用できます。リクエストフィルタでは、リクエストヘッダーを任意の方法(たとえば、受け入れヘッダーの調整)で変更して、正しいリソースメソッドと一致するようにすることができます。レスポンスフィルタでは、コールバッククエリのパラメータが使用可能かどうかに応じてJSONWithPaddingを使用してレスポンスエンティティをラップし、コンテンツタイプのヘッダーを調整できます。 (マーティンの大きな反響が来た前に)私は最終的にやってしまったので、何

+1

問題は、デフォルトでjQueryの*ヘッダを受け入れ送信するので、要求されたMIMEタイプと指定されたタイプは、JSONPであっても、要求としてアプリケーション/ JSONを送信したことにあります。私は最終的に別の答えで作業する必要があるものを入力していますが、要するにJersey以外のフィルタとラッパーを作成してJSONリクエストのコールバックパラメータが存在するかどうかを確認し、存在する場合はコールバックを追加します応答出力。しかし、返信いただきありがとうございます! –

1

はフィルタと出力を傍受ResponseWrapperを作成しました。 http://docs.oracle.com/cd/B31017_01/web.1013/b28959/filters.htm

は、本質的に、フィルタチェックがコールバックパラメータが存在するかどうかを確認するためにコードの基礎です。そうであれば、出力されたJSONにコールバックを付加し、最後に)を追加します。これはまだ固まっていませんが、私たちのテストでは素晴らしいことです。ジャージーが自動的にそれを処理できるようになったのは大好きでしたが、jQueryを正しく動作させることができませんでした(ジャージーの問題ではなく、おそらく私の側にあるもの)。私たちは既存のjQuery呼び出しを持っており、新しいJerseyサーバーを見るためにURLを変更しています。実際には$ .ajax呼び出しごとにヘッダーやコンテンツタイプを変更する必要はありませんする必要がある。

小さな問題とは別に、Jerseyは素晴らしい仕事をしてくれました。