Jersey-La anotación @Context para inyección. ¿Cómo funciona?


Estaba mirando un buen tutorial de DESCANSO usando Jersey . En la página, hay un recurso web que se construye que se titula TodoResource que a su vez contiene dos variables de instancia

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 de instancia UriInfo y Request. Sé que el uso de la anotación @Context permite inyectar información, pero ¿en qué momento sucede esto? ¿Esto será manejado automáticamente por Jersey?

Author: Patrick, 2011-05-26

3 answers

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

Después de que se invoca el constructor de clase, se inyectan los campos de contexto.
(Si intenta acceder a esos campos dentro del constructor, serán null)

En tu caso, la clase no necesitaría un constructor específico, así que solo:

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ía acceso a campos de contexto.

 23
Author: java.is.for.desktop.indeed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-22 11:25:30

He encontrado algunos resultados interesantes con las Reglas de Inyección , 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.

 27
Author: Mike Summers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-23 15:23:38

Use @PostConstruct método 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
    }
}
 17
Author: Kinjeiro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-03 10:46:06