Подтвердить что ты не робот

Как зарегистрировать несколько сервлетов в web.xml в одном приложении Spring

Я хочу определить два сервлета в моем Spring web.xml - один для страниц приложения html/jsp и один для веб-службы, который будет вызываться внешним приложением. Вот web.xml:

<servlet>
  <servlet-name>myservlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>myservlet</servlet-name>
  <url-pattern>*.htm</url-pattern>
</servlet-mapping>

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>WEB-INF/user-service-servlet.xml</param-value>
</context-param>

<servlet>
  <servlet-name>user-webservice</servlet-name>
  <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>user-webservice</servlet-name>
  <url-pattern>/UserService/*</url-pattern>
</servlet-mapping>

Если у меня есть myservlet, используйте DispatcherServlet в файле сам по себе, он отлично работает. Если у меня есть пользовательский веб-сервис с контекстным параметром для его конфигурационного файла (user-service-servlet.xml), он отлично работает. Однако, если у меня есть оба файла, то myservlet не работает, так как файл myservlet-servlet.xml не загружается автоматически. Если я удалю контекст-параметр, то myservlet будет работать, но пользователь-webservice не работает, так как его файл конфигурации (user-service-servlet.xml) не загружен.

Как я могу установить оба сервлета и оба их файла конфигурации загружены?

4b9b3361

Ответ 1

Как объяснено в этот поток в списке рассылки cxf-user, вместо того, чтобы CXFServlet загружать свой собственный spring контекст из user-webservice-servlet.xml, вы можете просто загрузить весь лот в корневой контекст. Переименуйте существующий user-webservice-servlet.xml в другое имя (например, user-webservice-beans.xml), затем измените свой параметр contextConfigLocation на следующее:

<servlet>
  <servlet-name>myservlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>myservlet</servlet-name>
  <url-pattern>*.htm</url-pattern>
</servlet-mapping>

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
    /WEB-INF/applicationContext.xml
    /WEB-INF/user-webservice-beans.xml
  </param-value>
</context-param>

<servlet>
  <servlet-name>user-webservice</servlet-name>
  <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
  <load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>user-webservice</servlet-name>
  <url-pattern>/UserService/*</url-pattern>
</servlet-mapping>

Ответ 2

Используйте config что-то вроде этого:

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

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

<servlet>
  <servlet-name>myservlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet>
  <servlet-name>user-webservice</servlet-name>
  <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
  <load-on-startup>2</load-on-startup>
</servlet>

а затем вам понадобятся три файла:

  • applicationContext.xml;
  • myservlet-servlet.xml; и
  • пользователем вебсервис-servlet.xml.

Файлы *-servlet.xml используются автоматически, и каждый создает контекст приложения для этого сервлета.

Из документации Spring 13.2. DispatcherServlet:

Структура будет при инициализации a DispatcherServlet, найдите файл с именем [servlet-name] -servlet.xml в каталоге WEB-INF вашего веб-сайта приложения и создайте beans(переопределение определения любого beans, определенного с помощью одно и то же имя в глобальном масштабе).

Ответ 3

Я знаю, что это немного устарело, но короткий ответ будет < load-on-startup > оба вхождения дали один и тот же идентификатор, который равен 1 дважды. Это может смутить последовательность загрузки.