2

REST 要求に応答するクラスの予想されるライフサイクルの動作を知りたいです。

リクエストに応答するための別のクラスを識別する javax.ws.rs.core.Application から派生したクラスがあります。

その他のクラスでは、@Path("foo") で注釈が付けられ、このクラス内のメソッドには @Path("bar") で注釈が付けられます。foo/bar に対してリクエストが行われると、コンストラクターが実行され、PostConstruct メソッドが適切に呼び出されることがわかります。メソッドがクライアントに応答を返した後、PreDestroy が呼び出され、クラスが押しつぶされていることがわかります。次の要求で、プロセスが繰り返されます。

これは正しい動作ですか?または、リクエストが行われるたびにコンストラクターと PostConstruct を通過する必要がないように、このクラスをメモリに残す方法はありますか? このメソッドは、JAXB マーシャリングとさまざまな XSL 変換に依存しています。コンパイルされた XSLT 変換オブジェクトといくつかの変換の結果をキャッシュしたいのですが、呼び出されるたびにクラスが再インスタンス化されると、ローカル キャッシュが不可能になります。

これは Java 7、Wink、および Tomcat 7 で実行されています。誰かがこれが予想される動作であるかどうかを教えてもらえますか?それとも、このクラスを維持するための何かが欠けているのでしょうか?

ありがとう。

4

1 に答える 1

1

JAX-RS 仕様により、リソース ( で注釈が付けられたクラス@Path) は要求ごとに作成されます。

この動作をオーバーライドするには、いくつかの方法があります。

JAX-RS 仕様に従って使用できる最も簡単な方法は、自分でリソース インスタンスを作成し (PostConstruct を呼び出す責任があります。この場合、いつどのように PostDestroy を呼び出すかはわかりません)、次を使用して返すことです。javax.ws.rs.core.Application.getSingletons()

@org.apache.wink.common.annotations.Scope(ScopeType.SINGLETON)または、リソースに注釈を付けることができます。

Spring を使用する場合、Wink にはきちんとした Spring 統合モジュールがあるため、Spring のライフサイクルが使用されます。http://incubator.apache.org/wink/1.0/html/5.5%20Spring%20Integration.htmlを参照してください。

于 2013-03-18T07:31:14.770 に答える