结合Spring项目和Jersey
我已经用Spring JPA构建了一个项目,现在我想在Jersey项目中使用它。我已经将我的SJPA项目添加为pom.xml中的依赖项
当我使用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();
}
}
回答:
你无需在需要的ApplicationContext位置创建服务。你应该能够配置一个全局的。为此,Jersey提供了一个模块,该模块集成了两个框架。这使你可以将@Autowired
所有Spring服务简单地放入Jersey资源类中。
注意:${spring3.version}
示例中的版本是3.2.3.RELEASE。可以在示例中使用Spring 4,但是你需要确保从jersey-spring3依赖项中排除所有Spring传递依赖项。
[ 1 ]-关于Java配置示例的一件事要注意的是它使用一个独立的应用程序。要在Web应用程序中使用Java配置,需要一些技巧。这是一个已知的错误,Jersey会在该错误中查找contextConfigLocation具有applicationContext.xml文件位置的参数,并且在找不到该参数时会引发异常。
我发现了一些解决方法。
- 提出问题的人提到了一个这样的例子。你可以创建一个Spring Web初始化程序,在其中配置Spring上下文并覆盖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;
}
}
- 你可以简单地将其添加
applicationContext.xml
到类路径中,然后将spring Java配置类注册为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>
- 我可以想到另一种方法,但是我已经保存了一段时间,可以进行实际测试了。
更新
“无法读取候选组件类… ASM ClassReader无法解析类文件-可能是由于尚不支持新的Java类文件版本”
似乎与此有关,将Spring 3与Java 8一起使用。就像我说的那样,如果要使用Spring 4,则需要从中排除Spring传递依赖项,jersey-spring3
而只更改显式声明的Spring依赖项的版本。这是我测试并工作的示例。
<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>
以上是 结合Spring项目和Jersey 的全部内容, 来源链接: utcz.com/qa/415666.html