/ / Cómo hacer que un servicio JAX-RS de Jersey sea un frijol Spring en sí mismo - spring, web-services, jersey, jax-rs, spring-aop

Cómo hacer que un servicio JAX-RS de Jersey sea un frijol Spring en sí mismo - spring, web-services, jersey, jax-rs, spring-aop

Tengo una clase de servicio web de Jersey, por ejemplo:

@Service
@Path("/serv")
public class Service {

@Autowired
@Qualifier("dao")
Dao dao;


@GET
@Path("/get")
public Response get(@QueryParam("hash") String hash) {
// ...
}
}

Ahora funciona el auto-cableado, porque yo uso jersey-spring3 como se describe aquí: https://jersey.java.net/documentation/latest/spring.html

También tengo el Servlet habitual en web.xml:

<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.test.rest</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

Los frijoles están cableados, todo fresco. El problema es que la propia clase de servicio no parece ser administrada por Spring.

Entonces, cuando intento anotar el servicio JAX-RS, digamos con @Timed anotación de métricas, la llamada no es interceptada por AOP.

¿Puedo de alguna manera superar el problema? Me gustaría que Spring pudiera "ver" las llamadas a los métodos de servicio; Service::get en el ejemplo anterior.

Respuestas

1 para la respuesta № 1

Si está utilizando la configuración de Java, necesita obtener las clases de servicio de Spring para entregar a Jersey. Algo como:

public class JerseyProductConfig extends ResourceConfig {

@Inject
public JerseyProductConfig(ServletContext servletContext) {
WebApplicationContext springFactory = WebApplicationContextUtils.getWebApplicationContext(servletContext);
register(springFactory.getBean(YourResource.class));
}

}

Tenga en cuenta que encontré esta solución en algún lugar en stackoverflow pero no puedo encontrar la publicación.