Весна-WS:SimpleWsdl11Definition с многоузловой таксономией для WSDL
-
25-09-2019 - |
Вопрос
Весна-WS 1.5:Используя SimpleWsdl11Definition, вы можете легко представить WSDL (из документа Spring-WS) в конфигурации XML:
<bean id="orders" class="org.springframework.ws.wsdl.wsdl11.SimpleWsdl11Definition">
<constructor-arg value="/WEB-INF/wsdl/Orders.wsdl"/>
</bean>
Возвращает URL-адрес, предоставляющий WSDL по адресу:
http://localhost:8080/spring-ws/orders.wsdl
Идентификатор bean-компонента SimpleWsdl11Definition + ".wsdl" становится конечным элементом URL-адреса WSDL при развертывании, что охватывает таксономию с одним узлом.
Мне нужно поддерживать раскрытие WSDL-файлов с многоузловой таксономией.
Например:
http://localhost:8080/spring-ws/domain/subdomain/foo.wsdl
Как это достигается в Spring-WS?Атрибуты Bean ID не допускают использования символов «/», поэтому мне интересно, какие существуют способы повлиять на URL-адрес WSDL.
Примечание:Использование сгенерированных WSDL-файлов не будет включено (по причинам обратной согласованности), например, с DefaultWsdl11Definition.Как и в случае с SimpleWsdl11Definition, я хотел бы сопоставить запросы WSDL со статическим WSDL.
Спасибо.
Решение 2
После того, как явился вокруг источника SPRING-WS, я обнаружил, что нет поддержки для выставления путей Multi-Node для конфигурации Static-pooked WSDL.
Поэтому я подклассул MessagedScatcherServlet и SimpleWSDL11DEfinition, а на моем сервлете предоставил мой собственный Mapper WSDL-запрос, который поддерживает существующие бобы WSDLEFINITION, а также моим «указанным местоположением» WSDLEDEFINITION BELE.
Дает способность настроить в таком виде способа:
<!-- exposes URL: host/context-root/servlet-name/MyService.wsdl -->
<bean id="MyService" class="org.springframework.ws.wsdl.wsdl11.SimpleWsdl11Definition">
<property name="wsdl" value="/WEB-INF/wsdl/MyService.wsdl" />
</bean>
<!-- exposes URL: host/context-root/servlet-name/some/multi/node/taxonomy/path/MyService.wsdl -->
<bean id="MyService.otherVersion" class="path.to.my.EnhancedWsdl11Definition">
<property name="wsdl" value="/WEB-INF/wsdl/otherVersion/MyService.wsdl" />
<property name="locationUri" value="some/multi/node/taxonomy/path/MyService.wsdl" />
</bean>
Все хорошо.
Другие советы
У меня возникла та же проблема: две версии веб-сервиса с разными URL-адресами.
old version within http://hostname/ws.wsdl
new version within http://hostname/version/ws.wsdl
Мое решение заключалось не в использовании общего сервлета org.springframework.ws.transport.http.MessageDispatcherServlet, а в использовании стандартного org.springframework.web.servlet.DispatcherServlet и настройке сопоставлений URL-адресов для различных версий wsdl в моей конфигурации bean-компонента.
Я предпочитаю это решение, потому что оно работает без создания подклассов весенних классов.
веб.xml:
<servlet>
<servlet-name>webservice</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>webservice</servlet-name>
<url-pattern>/ws</url-pattern>
<url-pattern>/ws.wsdl</url-pattern>
<url-pattern>/version/ws</url-pattern>
<url-pattern>/version/ws.wsdl</url-pattern>
</servlet-mapping>
beans.xml
<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory" />
<bean
class="org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter">
<property name="messageFactory" ref="messageFactory" />
</bean>
<bean id="messageDispatcher"
class="org.springframework.ws.soap.server.SoapMessageDispatcher" />
<bean
class="org.springframework.ws.transport.http.WsdlDefinitionHandlerAdapter" />
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/ws.wsdl">ws</prop>
<prop key="/version/ws.wsdl">ws-newversion</prop>
</props>
</property>
<property name="defaultHandler" ref="messageDispatcher" />
</bean>
<bean id="ws"
class="org.springframework.ws.wsdl.wsdl11.SimpleWsdl11Definition">
<constructor-arg value="classpath:wsdl/oldversion/Service.wsdl" />
</bean>
<bean id="ws-newversion"
class="org.springframework.ws.wsdl.wsdl11.SimpleWsdl11Definition">
<constructor-arg value="classpath:wsdl/newversion/CarService.wsdl" />
</bean>
Таким образом, каждый wsdl предоставляется по заданному пути, настроенному в SimpleUrlHandlerMapping-Bean.