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