web-dev-qa-db-fra.com

Jersey - L'annotation @Context pour l'injection. Comment ça marche?

Je cherchais un bon tutoriel REST utilisant Jersey . Au bas de la page, il existe une ressource Web qui s'appelle TodoResource et qui contient elle-même deux variables d'instance

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

Je me demandais exactement comment les variables d'instance UriInfo et Request sont initialisées? Je sais qu'en utilisant le @Context l'annotation permet d'injecter des informations, mais à quel moment cela se produit-il? Est-ce que cela sera géré automatiquement par Jersey?

36
Joeblackdev

Jersey ne modifie pas la classe, mais crée à chaque demande du client.

Après le constructeur de classe a été invoqué, les champs de contexte sont injectés.
(Si vous essayez d'accéder à ces champs à l'intérieur du constructeur, ils seront null)

Dans votre cas, la classe n'aurait pas besoin d'un constructeur spécifique, alors juste:

public TodoResource () {
    // in most cases the ctor stays empty.
    // don't do much work here, remember: the ctor is invoked at every client request
}

Mais les méthodes internes (qui représentent des ressources Web) annotées avec @POST, @GET, ... vous auriez accès aux champs contextuels.

J'ai rencontré des résultats intéressants avec les Rules of Injection , voici ce que j'ai trouvé:

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

J'espère que ça aide.

27
Mike Summers

Utilisez @ PostConstruct annotation de méthode:

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