web-dev-qa-db-ja.com

Jersey-インジェクション用の@Contextアノテーション。どのように機能しますか?

良い 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;
    }
}

UriInfoRequestのインスタンス変数がどのように初期化されるのか、正確に疑問に思っていましたか? @Context注釈は情報の注入を許可しますが、これはどの時点で発生しますか?これはジャージーによって自動的に処理されますか?

36
Joeblackdev

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
  }
}

これがお役に立てば幸いです。

27
Mike Summers

@ 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
    }
}
17
Kinjeiro