结合Spring项目和泽西岛

我已经用Spring JPA构build了一个项目,现在我想在我的Jersey项目中使用它。 我在我的pom.xml中添加了我的SJPA项目作为依赖项

当我使用GET / POST / PUT / DELETE方法时,我想从我的SJPA使用我的服务类。 有没有简单的方法来做到这一点与注释? 或者我必须在每个类中获得AnnotationConfigApplicationContext ? 感觉有点浪费。

 @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(); } } 

注意:以下链接的示例项目来自Jersey主分支,该主分支当前是Jersey 3的快照,尚未发布。 Jersey 3将使用Spring 4,所以你可能会注意到依赖jersey-spring4 这个依赖关系还不存在,因为Jersey 3尚未发布(可能暂时还没有发布)。 所以使用的依赖是jersey-spring3 所有的例子应该仍然是一样的,只是改变一个依赖。 如果您想使用Spring 4,请参阅本答案中下面的示例pom中列出的依赖项


您不需要在需要该服务的位置创buildApplicationContext 。 你应该能够configuration一个全局的。 泽西岛有一个模块来整合这两个框架。 这使您可以简单地@Autowired所有的Spring服务到您的Jersey资源类中。

我不会试图举出任何例子,而只是链接到官方的例子。 他们是直接从项目,所以链接应该是一段好时间。 请特别注意Maven的依赖关系。 你将需要确保有他们的例子工作。

  • 泽西2.x与Spring XMLconfiguration
  • Jersey 2.x与Spring Javaconfiguration [ 1 ]
  • Jersey 1.x与Spring XMLconfiguration
  • 泽西2.x与春季启动

注意:示例中的${spring3.version}版本是3.2.3.RELEASE。 可以将Spring 4与示例一起使用,但是您需要确保从jersey-spring3依赖项中排除所有Spring传递依赖项。

[ 1 ] – 关于Javaconfiguration示例的一点要注意,它使用了独立的应用程序。 要在web应用程序中使用Javaconfiguration,需要一些技巧。 这是一个已知的错误 ,其中Jersey使用applicationContext.xml文件的位置查找param contextConfigLocation ,并在未find它时抛出exception。

我已经find了一些方法。

  1. 提出这个问题的人提到了一个例子。 您可以创build一个Spring网页初始化程序,在其中configurationspring上下文覆盖param属性。 ( 在这里看完整的例子)。

     @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. 您可以简单地将applicationContext.xml添加到类path中,并将spring的Javaconfiguration类注册为一个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. 还有另外一种方法可以考虑,但是我已经保存了一段时间,我可以真正地testing一下。


UPDATE

“无法读取候选组件类… ASM ClassReader无法parsing类文件 – 可能是由于尚未支持的新Java类文件版本”

好像我说过,如果你想使用Spring 4,你将需要从jersey-spring3排除Spring传递依赖,只是改变你显式声明的Spring依赖的版本。 这是一个例子,我testing和工作。

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