2011-12-18 26 views
1

我使用spring-jersey來公開休息服務。我的web.xml如下所示:Spring-jersey如何在多個環境下公開服務

<servlet> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 

讓說標準。 我在很多軟件包中都有很多休息服務,我需要在兩個環境中對它們進行組合,比如說「基礎」和「高級」服務。此外,我需要擺脫url模式中的「休息」前綴。所以我想對他們組分成兩個包,然後在web.xml中定義了兩個球衣的Servlet與com.sun.jersey.config.property.packages初始參數:

<servlet> 
    <servlet-name>Jersey REST Service</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.example.app.rest.base</param-value> 
    </init-param> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <url-pattern>/base/*</url-pattern> 
</servlet-mapping> 

<servlet> 
    <servlet-name>Another Jersey REST Service</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.example.app.rest.advanced</param-value> 
    </init-param> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Another Jersey REST Service</servlet-name> 
    <url-pattern>/advanced/*</url-pattern> 
</servlet-mapping> 

不幸的是由於組件的applicationContext掃描設置。 XML

<context:component-scan base-package="com.example.app" /> 

財產com.sun.jersey.config.property.packages被忽略(所有其他服務可以在每個環境下訪問),它不能處理這樣的。

我想知道如何以其他方式處理。我不想做的唯一的事情就是設置

<url-pattern>/*</url-pattern> 

它抓住每一個。

回答

1

您可以指定多個包。用逗號分隔它們。

<context:component-scan base-package="com.example.app,com.sun.jersey" /> 

您還可以定義兩個組件掃描項目,它們也應該工作得很好。

如果軟件包區分不起作用,請使用filter

<context:component-scan base-package="org.example"> 
     <context:include-filter type="regex" expression=".*Repository"/> 
    </context:component-scan> 

接着,就爲每個服務的單獨的applicationContext但使用的contextConfigLocation的一個init-PARAM和應用程序上下文的位置/名稱的初始化值。因此,如果您爲每個服務加載特定的應用上下文,那麼組件掃描過濾將加載您需要的一項服務的所有內容並排除另一項服務。其實,如果你爲每個文件分別創建一個xml文件,我相信你可以回到使用不同的包。

+0

另請參閱:http://stackoverflow.com/questions/5269450/multiple-packages-in-contextcomponent-scan-spring-config – AHungerArtist

+0

問題是,base-package的設置方式是所有其他服務都可用在兩種情況下。 – Espeen

+0

您可以嘗試過濾器。 http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-scanning-filters – AHungerArtist

相關問題