java - secuencia - Combinando el proyecto Spring y Jersey
sala amarilla las estaciones del año (1)
He creado un proyecto con Spring JPA, y ahora quiero usarlo en mi proyecto de Jersey. He agregado mi proyecto SJPA como una dependencia en mi pom.xml
Me gustaría usar mis clases de servicio de mi SJPA cuando uso los métodos GET / POST / PUT / DELETE.
¿Hay una manera fácil de hacer esto con anotaciones?
¿O tengo que obtener
AnnotationConfigApplicationContext
en cada clase?
Se siente como un desperdicio.
@Path("/users")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public final class UserResource
{
private AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
private PodcastService service;
@GET
public Response getAllPodcasts() {
context.scan("org.villy.spring.service");
context.refresh();
service= context.getBean(PodcastService.class);
return Response.ok(service.findAll()).build();
}
}
NOTA: Los proyectos de ejemplo vinculados a continuación son de la rama maestra de Jersey, que actualmente es una instantánea de Jersey 3, que aún no se ha lanzado.
Jersey 3 usará Spring 4, por lo que puede notar una dependencia
jersey-spring4
.
Esta dependencia aún no existe, ya que Jersey 3 aún no se ha lanzado (probablemente no por un tiempo).
Entonces la dependencia a usar es
jersey-spring3
.
Todo el ejemplo debería funcionar igual, solo cambiando esa dependencia.
Si desea usar Spring 4, consulte las dependencias enumeradas en el ejemplo pom a continuación en esta respuesta
No necesita crear el
ApplicationContext
donde necesita el servicio.
Debería poder configurar uno global.
Jersey tiene un módulo para esto que integra los dos marcos.
Esto le permite simplemente
@Autowired
todos sus servicios de Spring en sus clases de recursos de Jersey.
En lugar de tratar de producir algún ejemplo, simplemente vincularé a los ejemplos oficiales. Son directamente de los proyectos, por lo que los enlaces deberían ser buenos por algún tiempo. Tome especial no de las dependencias de Maven. Deberá asegurarse de tenerlos para que el ejemplo funcione.
- Jersey 2.x con la configuración Spring XML
- Jersey 2.x con la configuración de Spring Java [ 1 ]
- Jersey 1.x con la configuración Spring XML
- Jersey 2.x con Spring Boot
Nota:
La versión
${spring3.version}
en los ejemplos es 3.2.3.RELEASE.
Es posible usar Spring 4 con los ejemplos, pero deberá asegurarse de excluir todas las dependencias transitivas de Spring de la dependencia
jersey-spring3
.
[
1
] - Una cosa a tener en cuenta sobre el ejemplo de configuración de Java es que utiliza una aplicación independiente.
Para usar la configuración de Java en una aplicación web se requiere un poco de truco.
Este es
un error conocido
en el que Jersey busca un param
contextConfigLocation
con la ubicación del archivo
applicationContext.xml
y generará una excepción cuando no encuentre uno.
He encontrado algunas formas de evitar esto.
-
La persona que planteó el problema mencionó un ejemplo de esto. Puede crear un inicializador web Spring donde configure el contexto spring y anule la propiedad param. (Ver ejemplo completo here ).
@Order(1) public class SpringWebContainerInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { registerContextLoaderListener(servletContext); // Set the Jersey used property to it won''t load a ContextLoaderListener servletContext.setInitParameter("contextConfigLocation", ""); } private void registerContextLoaderListener(ServletContext servletContext) { WebApplicationContext webContext; webContext = createWebAplicationContext(SpringAnnotationConfig.class); servletContext.addListener(new ContextLoaderListener(webContext)); } public WebApplicationContext createWebAplicationContext(Class... configClasses) { AnnotationConfigWebApplicationContext context; context = new AnnotationConfigWebApplicationContext(); context.register(configClasses); return context; } }
-
Simplemente puede agregar
applicationContext.xml
al classpath y simplemente registrar la clase de configuración de Spring Spring como un bean<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> <bean id="config" class="com.your.pkg.SpringAnnotationConfig"/> </beans>
-
Hay otra forma en la que puedo pensar, pero la he guardado por un tiempo y realmente puedo probarlo.
ACTUALIZAR
"No se pudo leer la clase de componente candidato ... ASM ClassReader no pudo analizar el archivo de clase, probablemente debido a una nueva versión de archivo de clase Java que aún no es compatible"
Parece estar relacionado con
this
, usando Spring 3 con Java 8. Como dije, si desea usar Spring 4, deberá excluir las dependencias transitivas de Spring de
jersey-spring3
y simplemente cambiar la versión de sus dependencias de Spring declaradas explícitamente .
Aquí hay un ejemplo, que probé y funciona.
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-spring3</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.0.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.0.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.1</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.1</version>
</dependency>