2016-08-31 1 views
1

Ради обучения (Весенняя загрузка - великая и волшебная ..), я пытаюсь настроить веб-приложение с помощью Jersey и Spring (для DI). Мне удалось заставить его работать, но только с конфигурацией Spring xml.Как заставить Джерси 2/Весна 4 загружать бобы из @ Конфигурации без конфигурации web.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"; 
    } 
} 

и мой весенний 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> 

также прилагает моего П файл

<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 или я рассмотреть возможность использования Spring Web/MVC для начальной загрузки приложения в целом.

ответ

2

Библиотека jersey-spring3 для «какой-то причине» в файле org.glassfish.jersey.server.spring.SpringWebApplicationInitializer.java по умолчанию ищет пути к классам ресурса:

sc.setInitParameter("contextConfigLocation", "classpath:applicationContext.xml"); 

и он не поддерживает конфигурации Spring на основе Java. Известная нерешенная проблема найдена here.

Итак, чтобы зарегистрировать конфигурации аннотаций на основе Java с помощью Spring DI, мне пришлось обходиться и загружать мое веб-приложение с помощью специальной реализации ServletContainerInitializer.

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"); 
    } 
} 
+0

Очень хорошая работа вокруг: Вот мой: https://github.com/bric3/jersey2-spring4-example – Brice

 Смежные вопросы

  • Нет связанных вопросов^_^