Spring-jersey如何在多个上下文中公开服务

时间:2011-12-18 09:58:44

标签: spring rest jersey

我使用春季运动衫来展示休息服务。我的web.xml如下所示:

<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-pattern中的“rest”前缀。所以我想把它们分成两个包,然后在web.xml中用com.sun.jersey.config.property.packages init param定义两个jersey servlet:

<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 个答案:

答案 0 :(得分: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和该应用程序上下文的位置/名称的init-value。因此,如果您为每个服务加载特定的应用程序上下文,组件扫描过滤将加载一个服务所需的所有内容并排除另一个服务。

<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/rest-service1.xml</param-value>
</init-paraam>

实际上,如果你为每个人制作一个单独的xml文件,我相信你可以回到那时使用不同的包。