Spring-WS: SimpleWsdl11Definition с многоузловой таксономией для WSDL - PullRequest
4 голосов
/ 04 августа 2010

Spring-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?Атрибуты идентификатора компонента не допускают использования символов "/", поэтому мне интересно, какие существуют способы влияния на URL-адрес WSDL.

Примечание. Использование сгенерированных WSDL не будет включено (по причинам обратной согласованности), например, сDefaultWsdl11Definition.Как и в случае SimpleWsdl11Definition, я хотел бы отобразить запросы на WSDL на статический WSDL.

Спасибо.

Ответы [ 2 ]

5 голосов
/ 26 ноября 2010

У меня возникла та же проблема, выставив две версии веб-сервиса с разными URL.

old version within http://hostname/ws.wsdl
new version within http://hostname/version/ws.wsdl

Мое решение заключалось не в использовании универсального org.springframework.ws.transport.http.MessageDispatcherServletservlet, а в качестве значения по умолчанию org.springframework.web.servlet.DispatcherServlet и в настройках сопоставлений URL-адресов для различных версий wsdl в конфигурации моего компонента.

Я предпочитаю это решение, потому что оно работает без подклассов любых весенних классов.

web.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.

2 голосов
/ 06 августа 2010

Обойдя источник Spring-ws, я обнаружил, что не поддерживается отображение многоузлового пути для WSDL-конфигурации со статическим источником.

Поэтому я поместил в подклассы MessageDispatcherServlet и SimpleWsdl11Definition и в своем сервлете предоставилмой собственный преобразователь WSDL-запросов, который поддерживает существующие bean-компоненты WsdlDefinition, а также мой bean-компонент WsdlDefinition с указанием местоположения.

Дает возможность настроить таким образом:

<!-- 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>

Все хорошо.

...