Spring-Джерси, как выставить услуги в более чем одном контексте - PullRequest
1 голос
/ 18 декабря 2011

Я использую весеннюю майку для выставления услуг по отдыху.Мой 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>

Допустим, стандарт.У меня много служб отдыха во многих пакетах, и мне нужно объединить их в два контекста, скажем, «базовый» и «расширенный» сервисы.Более того, мне нужно избавиться от префикса rest в url-pattern.Поэтому я подумал о том, чтобы сгруппировать их в два пакета, а затем в web.xml определить два сервлета-джерси с параметром init 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 Ответ

1 голос
/ 18 декабря 2011

Вы можете указать несколько пакетов. Просто разделите их запятой.

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

Вы также можете определить два элемента сканирования компонентов, и они также должны работать так же.

Если различие пакетов не поможет, используйте фильтр .

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

А затем просто создайте отдельный applicationContext для каждой службы, но используйте init-param для contextConfigLocation и init-значение местоположения / имени этого контекста приложения. Таким образом, если вы создадите определенный контекст приложения для загрузки для каждой службы, фильтрация сканирования компонентов загрузит все необходимое для одной службы и исключит другую.

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

На самом деле, если вы создадите отдельный xml-файл для каждого, вы, я полагаю, можете просто вернуться к использованию другого пакета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...