Существует ли инфраструктура, библиотека или техника, которая объединяет JAX-RS и JAX-WS (или эквивалентную функциональность) в одну комбинированную службу аналогично использованию двух конечных точек (один SOAP и один REST) для одной и той же службы в WCF
Комбинированные JAX-RS и JAX-WS
Ответ 1
Apache CXF может выполнить эту работу. Подробнее читайте на http://cxf.apache.org/docs/frontends.html
Ответ 2
Это возможно со стандартной конфигурацией tomcat. Просто используйте отдельные URL-адреса для служб. Я решил поставить службу JAX-WS за "SOAP/", а остальные - за строчными буквами. Если вы хотите использовать "отдых" в URL-адресе, это еще проще, но не выглядит приятным для конечных пользователей. Не забудьте добавить также sun-jaxws.xml. Я оставил "init-params", поскольку они полезны для нормализованных URL-адресов. Вы можете оставить все, если хотите.
<?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"
version="2.5">
<display-name>displayname</display-name>
<filter>
<filter-name>rest</filter-name>
<filter-class>com.sun.jersey.spi.container.servlet.ServletContainer</filter-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>thepackage</param-value>
</init-param>
<init-param>
<!-- enables processing by JSPs if not JAX-RS handler is registered -->
<param-name>com.sun.jersey.config.feature.FilterForwardOn404</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.config.feature.CanonicalizeURIPath</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.config.feature.NormalizeURI</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.config.feature.Redirect</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>rest</filter-name>
<url-pattern>/firstresource/</url-pattern>
<url-pattern>/secondresource/</url-pattern>
</filter-mapping>
<listener>
<listener-class>
com.sun.xml.ws.transport.http.servlet.WSServletContextListener
</listener-class>
</listener>
<servlet>
<servlet-name>soap</servlet-name>
<servlet-class>
com.sun.xml.ws.transport.http.servlet.WSServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>soap</servlet-name>
<url-pattern>/SOAP</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>120</session-timeout>
</session-config>
</web-app>
Ответ 3
Addon to Mikhail отвечает, пример конфигурации CXF. Дополнительная информация находится на http://cxf.apache.org/docs/jax-rs-and-jax-ws.html#JAX-RSandJAX-WS-JAXRSandJAXWS
<!-- JAX-RS -->
<jaxrs:server id="customerService" address="/">
<jaxrs:serviceBeans>
<ref bean="customerService" />
</jaxrs:serviceBeans>
</jaxrs:server>
<!-- JAX-WS -->
<jaxws:endpoint implementor="#customerService"
address="/CustomerWorld" wsdlLocation="..."/>
<bean id="customerService" class="demo.jaxrs.server.CustomerService" />
Обновление: Peter Sananto создал проект maven в https://github.com/ExampleDriven/cxf-example