2015-01-04 2 views
2

Я пытаюсь создать сервер REST Servlet 3.0 без web.xml, то есть зависит только от классов Java и аннотаций. Я не совсем уверен, как я могу одновременно зарегистрировать класс Resource с Spring и с отображением сервлета.Основанная на аннотациях Spring/JAX-RS интеграция без web.xml

я в настоящее время:

public class ApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer 
{ 
    @Override 
    protected Class<?>[] getRootConfigClasses() 
    { 
     return new Class<?>[]{RootConfiguration.class}; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() 
    { 
     return new Class<?>[]{RestServletConfiguration.class}; 
    } 

    @Override 
    protected String[] getServletMappings() 
    { 
     return new String[] {"/*"}; 
    } 
} 


@Configuration 
@ComponentScan({"com.my.spring.beans", 
       "com.my.spring.services"}) 
public class RootConfiguration 
{ 
} 

@Configuration 
@ComponentScan("com.my.resource.classes") 
public class RestServletConfiguration 
{ 
} 

При запуске приложения, пружинные бобы подключены правильно, но я не уверен, как поступить с получением сервлет фильтр JAX-RS установлен правильно. В настоящее время я использую Джерси и не могу найти много в Интернете об интеграции Джерси с Spring без использования web.xml.

Кто-нибудь знает, как интегрировать Джерси с весной таким образом?

ответ

7

Вы можете интегрировать Spring и Jersey в режиме без XML.

Вам необходимо расширить класс com.sun.jersey.spi.spring.container.servlet.SpringServlet. например:

package org.test; 

import com.sun.jersey.spi.spring.container.servlet.SpringServlet; 
import javax.servlet.annotation.WebInitParam; 
import javax.servlet.annotation.WebServlet; 

@WebServlet(urlPatterns = {"/rest/*"}, initParams = { 
    @WebInitParam(name = "com.sun.jersey.config.property.packages", 
      value = "org.test.rest")}) 
public class JerseyServlet extends SpringServlet { 

} 

Собственно, это сервлет. Параметр com.sun.jersey.config.property.packages указывает, где сканирование ресурсов (классы с аннотацией @Path).

Следующий код является примером ресурса: должны быть отсканированы с помощью Spring для инъекции зависимостей

package org.test.rest; 

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 
import org.test.service.DummyService; 

@Path("test") 
@Component 
public class TestResource { 

    @Autowired 
    private DummyService service; 

    @GET 
    public String test() { 
     return service.sayHello(); 
    } 

} 

Такие ресурсы. например:

package org.test.rest; 

import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
@ComponentScan("org.test.rest") 
public class RestConfiguration { 

} 

И эта конфигурация может быть загружена классом инициализатора. например .:

package org.test; 

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; 
import org.test.rest.RestConfiguration; 
import org.test.service.ServiceConfiguration; 

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     return new Class<?>[]{ServiceConfiguration.class, RestConfiguration.class}; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return new Class<?>[]{}; 
    } 

    @Override 
    protected String[] getServletMappings() { 
     return new String[]{"/"}; 
    } 

} 

Может быть, вы хотите, чтобы увидеть pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>org.test</groupId> 
    <artifactId>jersey-spring</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>war</packaging> 

    <name>jersey-spring</name> 

    <properties> 
     <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>4.1.4.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
      <version>4.1.4.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-web</artifactId> 
      <version>4.1.4.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>com.sun.jersey.contribs</groupId> 
      <artifactId>jersey-spring</artifactId> 
      <version>1.18.3</version> 
      <exclusions> 
       <exclusion> 
        <groupId>org.springframework</groupId> 
        <artifactId>spring-context</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>org.springframework</groupId> 
        <artifactId>spring-web</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>org.springframework</groupId> 
        <artifactId>spring-core</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>org.springframework</groupId> 
        <artifactId>spring-beans</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>org.springframework</groupId> 
        <artifactId>spring-aop</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <dependency> 
      <groupId>javax</groupId> 
      <artifactId>javaee-web-api</artifactId> 
      <version>7.0</version> 
      <scope>provided</scope> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.1</version> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
        <compilerArguments> 
         <endorseddirs>${endorsed.dir}</endorseddirs> 
        </compilerArguments> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.3</version> 
       <configuration> 
        <failOnMissingWebXml>false</failOnMissingWebXml> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-dependency-plugin</artifactId> 
       <version>2.6</version> 
       <executions> 
        <execution> 
         <phase>validate</phase> 
         <goals> 
          <goal>copy</goal> 
         </goals> 
         <configuration> 
          <outputDirectory>${endorsed.dir}</outputDirectory> 
          <silent>true</silent> 
          <artifactItems> 
           <artifactItem> 
            <groupId>javax</groupId> 
            <artifactId>javaee-endorsed-api</artifactId> 
            <version>7.0</version> 
            <type>jar</type> 
           </artifactItem> 
          </artifactItems> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 

</project> 
+0

отображение сервлет работает, но используется ресурс имеет нулевые значения для любых autowired полей; предположительно потому, что это другой экземпляр ресурса, созданного весной. –

+0

Например, если я поставил точку останова в методе test() на TestResource, тогда значение null. –

+0

Что должно быть в методе getServletConfigClasses() в инициализаторе приложения? –

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