2012-07-12 3 views
9

하나의 web.xml에 여러 저지 서블릿을 포함 할 수 있습니까?하나의 web.xml에 여러 개의 저지 서블릿이 있습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 

    <display-name>myapi</display-name> 

    <context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/context-v1.xml /WEB-INF/context-v2.xml</param-value> 
    </context-param> 

    <listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <servlet> 
    <servlet-name>REST-V1</servlet-name> 
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> 
    <init-param> 
     <param-name>com.sun.jersey.config.property.packages</param-name> 
     <param-value>com.myapi.rest.v1</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
    <servlet-name>REST-V1</servlet-name> 
    <url-pattern>/v1/*</url-pattern> 
    </servlet-mapping> 

    <servlet> 
    <servlet-name>REST-V2</servlet-name> 
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> 
    <init-param> 
     <param-name>com.sun.jersey.config.property.packages</param-name> 
     <param-value>com.myapi.rest.v2</param-value> 
    </init-param> 
    <load-on-startup>2</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
    <servlet-name>REST-V2</servlet-name> 
    <url-pattern>/v2/*</url-pattern> 
    </servlet-mapping> 

    <welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
    </welcome-file-list> 

</web-app> 

을하지만 스프링 상황 v1 및 상황에 v2를 별도로 장착해야한다 :이 방법으로 RESTfull 버전을하려고? 그들은 등 같은 이름을 가진 콩을 가지고 있기 때문에

편집 :

내 콘솔 출력은 각 서블릿의 자원 (관리/정보)을 두 번로드 년대에 보면 :

15.07.2012 14:47:08 com.sun.jersey.api.core.PackagesResourceConfig init 
INFO: Scanning for root resource and provider classes in the packages: 
    com.myapi.rest.v1 
15.07.2012 14:47:08 com.sun.jersey.api.core.ScanningResourceConfig logClasses 
INFO: Root resource classes found: 
    class com.myapi.rest.v1.LOAdminResource 
    class com.myapi.rest.v1.LOInfoResource 
15.07.2012 14:47:08 com.sun.jersey.api.core.ScanningResourceConfig init 
INFO: No provider classes found. 
15.07.2012 14:47:09 com.sun.jersey.spi.spring.container.servlet.SpringServlet getContext 
INFO: Using default applicationContext 
15.07.2012 14:47:09 com.sun.jersey.spi.spring.container.SpringComponentProviderFactory registerSpringBeans 
INFO: Registering Spring bean, adminResource_v2, of type com.myapi.rest.v2.LOAdminResource as a root resource class 
15.07.2012 14:47:09 com.sun.jersey.spi.spring.container.SpringComponentProviderFactory registerSpringBeans 
INFO: Registering Spring bean, infoResource_v2, of type com.myapi.rest.v2.LOInfoResource as a root resource class 
15.07.2012 14:47:09 com.sun.jersey.spi.spring.container.SpringComponentProviderFactory registerSpringBeans 
INFO: Registering Spring bean, adminResource_v1, of type com.myapi.rest.v1.LOAdminResource as a root resource class 
15.07.2012 14:47:09 com.sun.jersey.spi.spring.container.SpringComponentProviderFactory registerSpringBeans 
INFO: Registering Spring bean, infoResource_v1, of type com.myapi.rest.v1.LOInfoResource as a root resource class 
15.07.2012 14:47:09 com.sun.jersey.server.impl.application.WebApplicationImpl _initiate 
INFO: Initiating Jersey application, version 'Jersey: 1.8 06/24/2011 12:17 PM' 
15.07.2012 14:47:09 com.sun.jersey.api.core.PackagesResourceConfig init 
INFO: Scanning for root resource and provider classes in the packages: 
    com.myapi.rest.v2 
15.07.2012 14:47:09 com.sun.jersey.api.core.ScanningResourceConfig logClasses 
INFO: Root resource classes found: 
    class com.myapi.rest.v2.LOAdminResource 
    class com.myapi.rest.v2.LOInfoResource 
15.07.2012 14:47:09 com.sun.jersey.api.core.ScanningResourceConfig init 
INFO: No provider classes found. 
15.07.2012 14:47:09 com.sun.jersey.spi.spring.container.servlet.SpringServlet getContext 
INFO: Using default applicationContext 
15.07.2012 14:47:09 com.sun.jersey.spi.spring.container.SpringComponentProviderFactory registerSpringBeans 
INFO: Registering Spring bean, adminResource_v2, of type com.myapi.rest.v2.LOAdminResource as a root resource class 
15.07.2012 14:47:09 com.sun.jersey.spi.spring.container.SpringComponentProviderFactory registerSpringBeans 
INFO: Registering Spring bean, infoResource_v2, of type com.myapi.rest.v2.LOInfoResource as a root resource class 
15.07.2012 14:47:09 com.sun.jersey.spi.spring.container.SpringComponentProviderFactory registerSpringBeans 
INFO: Registering Spring bean, adminResource_v1, of type com.myapi.rest.v1.LOAdminResource as a root resource class 
15.07.2012 14:47:09 com.sun.jersey.spi.spring.container.SpringComponentProviderFactory registerSpringBeans 
INFO: Registering Spring bean, infoResource_v1, of type com.myapi.rest.v1.LOInfoResource as a root resource class 
15.07.2012 14:47:09 com.sun.jersey.server.impl.application.WebApplicationImpl _initiate 
INFO: Initiating Jersey application, version 'Jersey: 1.8 06/24/2011 12:17 PM' 
+0

시작시로드 - 모든 경우에 1이되어야합니다. –

+0

은 아니요, 사실이 아닙니다. 서블릿의 부트 시퀀스 ... – Ben

답변

9

예. 두 개 이상의 서블릿을 web.xml에 지정할 수 있습니다. 각각에 대해 다른 서블릿 매핑을 지정하는 것을 잊지 마십시오.

<servlet> 
    <servlet-name>servletOne</servlet-name> 
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> 
    <init-param> 
    <param-name>com.sun.jersey.config.property.packages</param-name> 
    <param-value>com.packageOne</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet> 
    <servlet-name>servletTwo</servlet-name> 
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> 
    <init-param> 
    <param-name>com.sun.jersey.config.property.packages</param-name> 
    <param-value>com.packageTwo</param-value> 
    </init-param> 
    <load-on-startup>2</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>ServletOne</servlet-name> 
    <url-pattern>/v1/*</url-pattern> 
</servlet-mapping> 
    <servlet-mapping> 
    <servlet-name>ServletTwo</servlet-name> 
<url-pattern>/v2/*</url-pattern> 
</servlet-mapping> 

는 initParameter loadOnStartup는 (다음이 경우 제 servletOne 및 servletTwo)에 서블릿이로드되는 순서를 정의한다.

+0

이 true이면 두 서블릿이로드되지만 내 콘솔 출력 좀 봐. 내 문제는 내 리소스 (AdminResource, InfoResource) 각 서블릿에 대해 두 번로드됩니다 ... – Ben

+0

mmm ... 이상한 u've 정의 된 두 개의 다른 패키지 ... 대체 서버 및 서블릿을 정의 할 수 시도 할 수 있습니다. 프로그래밍 방식으로 (여기에 정의 된 코드로 http://stackoverflow.com/questions/11210734/jersey-on-jetty-on-android-throws-containerexception-the-resourceconfig-instanc Start Server Android 활동에서) – Giorgio

+0

올바르지 않습니다. 대답! Spring은 여기에 무엇을 놓을지라도 메인 컨텍스트에서 찾은 모든 주석 클래스를로드합니다. 그래서 똑같은 것을 제공 할 두 서블릿을 갖게 될 것입니다. 조심하고 그것을 시도하십시오! 정답은 위에 있습니다 ... – markthegrea

6

Jersey와 Spring을 함께 사용하면 Jersey/Spring 서블릿은 사용 가능한 모든 Spring Bean을 통과하고 그 중에서 찾을 수있는 모든 리소스와 공급자 클래스를 등록합니다.

동일한 (루트) 컨텍스트를 사용하여 여러 개의 Jersey/Spring 서블릿을 공유하고 Bean 정의를 공유하는 경우 해당 서블릿마다 프로 시저가 수행되고 리소스 및 공급자 클래스는 여러 번 등록됩니다.

동일한 bean을 여러 번 등록하지 않으려면 해당 bean을 각각의 Jesrey/Spring 서블릿의 하위 컨텍스트에 정의하십시오.

Spring 관리 클래스와 Jersey 관리 클래스가 혼합되어 있지 않으면 web.xml에서 클래스 선언을위한 초기화 매개 변수를 제공 할 필요가 없습니다.

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/root-context.xml</param-value> 
</context-param> 

... 

<servlet> 
    <servlet-name>REST-V1</servlet-name> 
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/context-v1.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet> 
    <servlet-name>REST-V2</servlet-name> 
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/context-v1.xml /WEB-INF/context-v2.xml</param-value> 
    </init-param> 
    <load-on-startup>2</load-on-startup> 
</servlet> 

... 
+0

이것은 선택된 대답이어야합니다. – manikanta

1

나는이 주제가 대답하기에는 오래된 것을 알고 있습니다. 하지만 제 대답은 다른 사람들을 도울 수 있습니다.()

    1. 공백
    2. 쉼표 (,)
    3. 세미콜론을 : 우리는 이러한 구분 기호와의 web.xml에서 여러 리소스 패키지를 구성 할 수 있습니다

      예 :

      <?xml version="1.0" encoding="UTF-8"?> 
      <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 
          <display-name>MultiplePackageRest</display-name> 
          <servlet> 
          <servlet-name>JerseyMultiplePackage</servlet-name> 
          <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
          <init-param> 
           <param-name>jersey.config.server.provider.packages</param-name> 
           <param-value>info.javadoff.rest1,info.javadoff.rest2,...</param-value> 
          </init-param> 
           <load-on-startup>1</load-on-startup> 
          </servlet> 
          <servlet-mapping> 
          <servlet-name>JerseyMultiplePackage</servlet-name> 
          <url-pattern>/api/*</url-pattern> 
          </servlet-mapping> 
      </web-app> 
      
    1

    한 가지 방법은 com.sun.jersey.spi.spring.container.servlet.SpringServlet에서 한 가지 방법을 재정의하는 것입니다. 초기화 메소드는 다음과 같습니다 (버전 1.19.1) :

    @Override 
    protected void initiate(ResourceConfig rc, WebApplication wa) { 
        try { 
         SpringComponentProviderFactory springComponentProviderFactory = new SpringComponentProviderFactory(rc, getContext()); 
         rc.getClasses().removeIf(clazz -> clazz.getPackage().getName().startsWith("bla")); 
         wa.initiate(rc, springComponentProviderFactory); 
        } catch (RuntimeException e) { 
         LOGGER.log(Level.SEVERE, "Exception occurred when intialization", e); 
         throw e; 
        } 
    } 
    

    비트 :이 같은 서브 클래스의 코드를 변경하는 경우

    @Override 
    protected void initiate(ResourceConfig rc, WebApplication wa) { 
        try { 
         wa.initiate(rc, new SpringComponentProviderFactory(rc, getContext())); 
        } catch (RuntimeException e) { 
         LOGGER.log(Level.SEVERE, "Exception occurred when intialization", e); 
         throw e; 
        } 
    } 
    

    는, 당신은 예를 들어, 패키지 이름에 대한 기준()을 기반으로 원치 않는 봄 콩을 필터링 할 수 있습니다 해키 솔루션,하지만 우리를 위해 완벽하게 작동합니다.

    관련 문제