una secuencia sala proyecto preescolar plantas planeacion para niños las juegos estaciones didactica dar cuatro como clase años año amarilla java spring jersey jax-rs

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.

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.

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

  2. 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>

  3. 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>