Джерси - аннотация @Context для инъекций.Как это работает? - PullRequest
36 голосов
/ 26 мая 2011

Я искал хорошее учебное пособие REST, используя Джерси .Внизу страницы есть встроенный веб-ресурс с названием TodoResource, который сам содержит две переменные экземпляра

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 позволяет вводить информацию, но в какой момент это происходит?Будет ли это обрабатываться Джерси автоматически?

Ответы [ 3 ]

27 голосов
/ 20 января 2012

Я столкнулся с некоторыми интересными результатами с Правилами впрыска , вот что я нашел:

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

Надеюсь, это поможет.

23 голосов
/ 22 июля 2011

Джерси не изменяет класс, но создает при каждом запросе от клиента.

После был вызван конструктор класса, вставлены поля контекста.
(Если вы попытаетесь получить доступ к этим полям внутри конструктора, они будут 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, ..., у вас будет доступ к полям контекста.

17 голосов
/ 04 июня 2012

Использование @ 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...