良い Jerseyを使用したRESTチュートリアル を見ていました。ページの下には、TodoResource
というタイトルのWebリソースが構築されており、それ自体に2つのインスタンス変数が含まれています
public class TodoResource {
@Context
UriInfo uriInfo;
@Context
Request request;
String id;
public TodoResource(UriInfo uriInfo, Request request, String id) {
this.uriInfo = uriInfo;
this.request = request;
this.id = id;
}
}
UriInfo
とRequest
のインスタンス変数がどのように初期化されるのか、正確に疑問に思っていましたか? @Context
注釈は情報の注入を許可しますが、これはどの時点で発生しますか?これはジャージーによって自動的に処理されますか?
Jersey 変更しないクラスですが、クライアントからのすべてのリクエストで作成です。
Afterクラスコンストラクターが呼び出され、コンテキストフィールドが挿入されます。
(コンストラクター内のこれらのフィールドにアクセスしようとすると、null
になります)
あなたの場合、クラスは特定のコンストラクタを必要としないため、次のようにします。
public TodoResource () {
// in most cases the ctor stays empty.
// don't do much work here, remember: the ctor is invoked at every client request
}
ただし、@POST, @GET, ...
アノテーションが付けられたメソッド(Webリソースを表す)内では、コンテキストフィールドにアクセスできます。
Rules of Injection でいくつかの興味深い結果に遭遇しました。ここに私が見つけたものがあります:
public class TodoResource{
@Context
UriInfo uriInfo; // Set second
public TodoResource(@Context UriInfo value){
uriInfo = value; // Set first (makes sense)
}
@Context
public void setUriInfo(UriInfo value){
uriInfo = value; // Set third
}
}
これがお役に立てば幸いです。
@ PostConstructメソッドアノテーションを使用します。
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@Path("foo")
public class AuthResource {
@Context
HttpServletRequest request;
public AuthResource() {
//request is null
}
@PostConstruct
public void postConstruct() {
//request is NOT null
}
@PreDestroy
public void preDestroy() {
//after rest method executing
}
}