ExceptionMapper を実装する単一インスタンス クラスがあります。これは静的クラスではありませんが、単一のインスタンスのみが作成されることがわかっているクラスです(確認しました-コンストラクターは1回だけ呼び出されます)。
私のクラスは@Context HttpServletRequestを使用しており、私のExceptionMapper.toResponse()メソッドが呼び出されると、@Context 'request'パラメータに、例外がスローされるリクエストに関連する値があることを明確に観察できます。
ドキュメントによると 、これは実際に設計によってサポートされている機能であり、「プロキシ」を使用して行われます。
これがどのように正確に実装されているのだろうか-単一のインスタンスが異なるメンバー変数の値を同時に持つことができる方法は?
ありがとう、
AG
PS: テスト コードは次のとおりです。
@Provider
public class MyExceptionMapper implements ExceptionMapper<Exception> {
public MyExceptionMapper() {
System.out.println("CTOR!!");
}
@Context HttpServletRequest req;
public static boolean done = false;
public Response toResponse(Exception ex) {
if (!done) {
done = true;
Thread.sleep(10000);
}
System.out.println(req.getRequestURI());
return null;
}
}
私のRESTハンドラーメソッドは例外をスローするため、次の2つのリクエストを「並行して」実行すると(上記のスリープにより、2番目のリクエストが到着したときに最初のリクエストが終了していないことが確認され、IMHOは唯一の「req」フィールドを変更する必要があります):
- http://localhost/app/one
- http://localhost/app/two
私のプログラムは次のように出力します:
CTOR!
http://localhost/app/one
http://localhost/app/two