首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使Jersey2/Spring4在无web.xml配置上从@Configuration加载bean

如何使Jersey2/Spring4在无web.xml配置上从@Configuration加载bean
EN

Stack Overflow用户
提问于 2016-08-31 20:06:49
回答 1查看 4.7K关注 0票数 1

为了学习(Spring很棒而且很神奇.),我正在尝试使用泽西岛和Spring建立一个web应用程序(用于DI)。我已经设法使它正常工作,但只限于使用Spring配置。

我扩展了ResourceConfig

代码语言:javascript
运行
复制
@ApplicationPath("/api")
public class JerseyWebApp extends ResourceConfig {

  public JerseyWebApp() {
      packages("com.company.controller");
  }
} 

我的HelloController.java

代码语言:javascript
运行
复制
@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

代码语言:javascript
运行
复制
@Component
@Scope(value = BeanDefinition.SCOPE_PROTOTYPE)
public class HelloService {

  public String sayHello() {
    return "hello from jersey webapp";
  }
}

还有我的春天applicationContext.xml

代码语言:javascript
运行
复制
<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文件

代码语言:javascript
运行
复制
<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>

可以让泽西岛通过@Configuration类加载bean,还是应该考虑使用Spring /mvc引导整个应用程序。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-02 19:34:22

默认情况下,由于“某些原因”在文件jersey-spring3中查找类路径资源的库org.glassfish.jersey.server.spring.SpringWebApplicationInitializer.java

代码语言:javascript
运行
复制
sc.setInitParameter("contextConfigLocation", "classpath:applicationContext.xml");

而且它不支持基于Java的Spring配置。这是一个已知的未解决的问题,发现了这里

因此,要向Spring注册基于Java的注释配置,我必须解决这个问题,并使用ServletContainerInitializer的自定义实现引导我的web应用程序。

JerseyServletContainerInitializer.java

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
public class JerseyResourceConfig extends ResourceConfig {

  public JerseyResourceConfig() {
    packages("com.company.controller");
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39258159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档