1

基本的に、オブジェクトを JSON として書き込む MessageBodyWriter があり、リクエストを処理したリソース メソッドに基づいて、出力のいくつかの側面を制御できるようにしたいと考えています。ただし、@Provider クラスのデフォルトのライフサイクルはシングルトン (JVM ごとに 1 つ) であるため、一部の構成オブジェクトのインスタンスを注入することはできません。これにより、2 つの明らかな回避策が残されます。

  1. カスタム注釈を使用する: writeTo(...) への各呼び出しには、呼び出されたメソッドの注釈のリストが含まれているため、注釈の存在を確認できます。ただし、JAX-RS メソッドには、すでにメタプログラミングがかなり含まれています。
  2. ThreadLocal プロパティ マップを使用します。スレッドごとに 1 つのリクエストを想定していますが、このアプローチではカプセル化が少し壊れます。リソース メソッドは、このマップを探している他のクラスがあることを認識している必要があります。

プロバイダー自体のライフサイクルを変更する方法はありますか? ジャージーを使用しています。

4

2 に答える 2

2

リクエストごとに MessageBodyWriter プロバイダーが必要な理由がわかりません。JSON出力を使用するメソッドとそうでないメソッドを区別したいだけの場合は、jersey-jsonすでにサポートされています。

そして、@Providerシングルトンですが。以下のように、その中でリクエストごとのオブジェクトを引き続き使用できます。

@Provider
public class StViewProcessor implements ViewProcessor<ST> {     

    ......

    @Context
    HttpServletRequest request;


    public void writeTo(ST st, Viewable viewable, OutputStream out)
            throws IOException {
        System.out.println(request.getRequestURI());
        ...
    }


}

また、リクエストごとにインスタンスを注入する場合は、PerRequestTypeInjectableProvider. ここにそれに関するリンクがあります。

于 2013-05-02T07:38:41.660 に答える
1

JAX-RS 1.1 仕様では、実装がシングルトン プロバイダーをサポートし、他のライフサイクルをサポートできるようにする必要がありますが、それらの線に沿って他に何も提案していません。私の知る限り、純粋な Jersey はシングルトン以上のものをサポートしていません。jersey-spring contrib モジュールを使用すると、Spring を Jersey の IoC コンテナー (リソースとプロバイダーのインスタンスを取得する場所) として使用するためのサポートが得られます。Spring がリクエストを含む複数のライフサイクルをサポートしていることは知っていますが、そのサポートが jersey-spring に組み込まれているかどうかはわかりません。

于 2013-05-02T00:30:37.983 に答える