2011-07-13 15 views
5

Intento inyectar servicios en una clase de descanso que utiliza Jersey.Integración de jersey y muelle: las inyecciones de bean son nulas en el tiempo de ejecución

No importa qué o cómo trato de inyectar en esta clase parece aparecer como nulo en el tiempo de ejecución. Buscar en los archivos de registro muestra que se llama al setJsonTestService cuando se inicializa la aplicación web y que no es nula en este momento. Pero, cuando se accede más tarde con una solicitud PUT a esta clase, es nulo.

Estoy completamente desconcertado.

La clase tiene el siguiente aspecto:

@Named 
@Path("JsonTest") 
public class JsonTest { 
    @Context 
    Request request; 
    @Context 
    UriInfo uriInfo; 

    protected final Logger log = Logger.getLogger(getClass()); 

    private JsonTestService jsonTestService; 

    @Autowired 
    public void setJsonTestSerivce(JsonTestService jsonTestService) { 
     log.info("Setting JsonTestService."); 
     if (jsonTestService == null) { 
      log.info("JsonTestService is null at injection"); 
     } 
     this.jsonTestService = jsonTestService; 
    } 

    @Inject 
    public ScrapIntermediate scrapIntermediate; // just a plain empty class with an is true method 

    @PUT 
    @Path("{id}") 
    @Produces(MediaType.APPLICATION_JSON) 
    public void putJson(@PathParam("id") String id) { 
     log.info("Putting some json at " + id); 
     if (scrapIntermediate == null) { 
      log.info("scrapIntermediate is null..."); 
     } 
     if (jsonTestService != null) { 
      jsonTestService.sendUpdate(); 
     } else { 
      log.info("jsonTestService is null..."); 
     } 
    } 
} 

¿Alguna idea?

Actualización:

web.xml (Jersey)

<servlet> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>com.sun.jersey.config.property.packages</param-name> 
     <param-value>EDAS</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 
+2

¿Cómo se asignan las solicitudes web a esta clase de Jersey? Parece que Spring crea una instancia de esta clase, pero Jersey crea otra instancia para usar en el manejo de las solicitudes. –

+0

He actualizado la pregunta para mostrar la porción de Jersey de mi web.xml. Ese es el único otro lugar donde menciono a Jersey. – zclark

+0

Y resuelto. El problema relacionado con Maven y mi Jersey importan causando que se importen tanto el contexto de primavera 2.5.6 como 3.0.5. Esto causó el conflicto de anotación y condujo a las diferentes instancias de la misma clase. Lo publicaré como respuesta una vez que me lo permita ... Gracias por la visión Matt. – zclark

Respuesta

4

Trate

<servlet-class> 
    com.sun.jersey.spi.spring.container.servlet.SpringServlet 
</servlet-class> 

También necesitará el contextConfigLocation<context-param>, pero supongo que lo tienes. See here para más detalles sobre la configuración

Como matt b sugiere que la primavera crea sus objetos, pero Jersey no sabe nada acerca de la primavera y los ejemplifica de nuevo. Cuando usa el SpringServlet, debe ubicar el contexto de la aplicación de primavera.

Dicho esto, spring-mvc proporciona soporte para servicios RESTful que es muy similar al de JAX-RS. Puedes intentarlo también.

+0

Sí, estaba jugando con esto y terminé usándolo cuando lo hice funcionar. Simplemente no me dejaría sin las exclusiones de Maven adecuadas. – zclark

Cuestiones relacionadas