2011-05-26 16 views
33

Estaba buscando un buen REST tutorial using Jersey. abajo de la página, hay un recurso web que se construye que se titula TodoResource que a su vez contiene dos variables de instanciaJersey: la anotación @Context para inyección. ¿Como funciona?

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

me preguntaba exactamente cómo se inicializan las variables y UriInfoRequest ejemplo? Sé que usar la anotación @Context permite que se inyecte información, pero ¿en qué punto sucede esto? ¿Esto será manejado automáticamente por Jersey?

+3

no sé los detalles, pero sí, Jersey automagicamente inicializará esas variables para usted detrás de las escenas. Si necesita conocer los detalles de cómo funciona, en Eclipse, podría poner un "punto de observación" en una de esas variables, lo que le indica al depurador que se rompa cada vez que se modifique esa variable. Luego puede ver el trazado de la pila y ver qué clase de Jersey está modificándolo. – MatrixFrog

+0

Ok. Voy a dar una oportunidad. Gracias por la ayuda – Joeblackdev

Respuesta

20

Jersey no modifica la clase, pero crea que en cada petición del cliente.

Después de se invocó el constructor de clase, se insertaron los campos de contexto.
(en caso de intentar acceder a esos campos dentro del constructor, que será null)

En su caso, la clase no se necesita un constructor específico, por lo que sólo:

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

Pero dentro de los métodos (que representan recursos web) anotados con @POST, @GET, ..., tendrías acceso a los campos de contexto.

26

me he encontrado con algunos resultados interesantes con el Rules of Injection, esto es lo que he encontrado:

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

espero que esto ayude.

+0

Este código hace el truco, gracias Mike. – kazy

16

Uso @PostConstruct método de anotación:

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