为了学习(Spring Boot 很棒而且神奇..),我正在尝试使用 Jersey 和 Spring(用于 DI)设置一个 Web 应用程序。我已经设法让它工作,但只能使用 Spring xml 配置。
我扩展了ResourceConfig
@ApplicationPath("/api")
public class JerseyWebApp extends ResourceConfig {
public JerseyWebApp() {
packages("com.company.controller");
}
}
我的HelloController.java
@Path("/hello")
public class HelloController {
private HelloService helloService;
@Autowired
public HelloController(HelloService helloService) {
this.helloService = helloService;
}
@GET
public String hello() {
return helloService.sayHello();
}
}
我的HelloService.java
@Component
@Scope(value = BeanDefinition.SCOPE_PROTOTYPE)
public class HelloService {
public String sayHello() {
return "hello from jersey webapp";
}
}
和我的 spring applicationContext.xml
<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:component-scan base-package="com.company" />
</beans>
同时附上我的 pom 文件
<properties>
<jersey2.version>2.23.2</jersey2.version>
<jaxrs.version>2.0.1</jaxrs.version>
<spring.version>4.3.2.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>${jersey2.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-spring3</artifactId>
<version>${jersey2.version}</version>
<exclusions>
<exclusion>
<artifactId>spring-context</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-beans</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-web</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>jersey-server</artifactId>
<groupId>org.glassfish.jersey.core</groupId>
</exclusion>
<exclusion>
<artifactId>
jersey-container-servlet-core
</artifactId>
<groupId>org.glassfish.jersey.containers</groupId>
</exclusion>
<exclusion>
<artifactId>hk2</artifactId>
<groupId>org.glassfish.hk2</groupId>
</exclusion>
</exclusions>
</dependency>
<!--Spring 4-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
</dependencies>
是否可以让 Jersey 通过 @Configuration 类加载 bean,或者我应该考虑使用 Spring web/mvc 来引导整个应用程序。
最佳答案
由于“某种原因”,文件 org.glassfish.jersey.server.spring.SpringWebApplicationInitializer.java
中的库 jersey-spring3
默认情况下正在寻找类路径资源:
sc.setInitParameter("contextConfigLocation", "classpath:applicationContext.xml");
并且它不支持基于Java的Spring配置。这是一个已知的未解决问题 here .
因此,要使用 Spring DI 注册基于 Java 的注释配置,我必须解决它并使用 ServletContainerInitializer
的自定义实现来引导我的 Web 应用程序。
JerseyServletContainerInitializer.java
public class JerseyServletContainerInitializer implements ServletContainerInitializer {
@Override
public void onStartup(Set<Class<?>> classes, ServletContext servletContext) throws ServletException {
//Register spring configurations
AnnotationConfigWebApplicationContext springContext = new AnnotationConfigWebApplicationContext();
springContext.register(SpringConfig.class, JPAConfig.class);
servletContext.addListener(new RequestContextListener());
servletContext.addListener(new ContextLoaderListener(springContext));
springContext.setServletContext(servletContext);
//Register Jersey servlet
ServletRegistration.Dynamic servletRegistration = servletContext.addServlet("JerseyServlet", new ServletContainer());
servletRegistration.addMapping("/api/*");
servletRegistration.setLoadOnStartup(1);
servletRegistration.setInitParameter("javax.ws.rs.Application", JerseyResourceConfig.class.getName());
}
}
JerseyResourceConfig.java
public class JerseyResourceConfig extends ResourceConfig {
public JerseyResourceConfig() {
packages("com.company.controller");
}
}
关于java - 如何让 Jersey 2/Spring 4 在没有 web.xml 配置的情况下从 @Configuration 加载 beans,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39258159/