Spring-WS:具有 WSDL 多节点分类的 SimpleWsdl11Definition

Posted

技术标签:

【中文标题】Spring-WS:具有 WSDL 多节点分类的 SimpleWsdl11Definition【英文标题】:Spring-WS: SimpleWsdl11Definition with a multi-node taxonomy for WSDL 【发布时间】:2010-08-04 16:55:44 【问题描述】:

Spring-WS 1.5:使用 SimpleWsdl11Definition,在 XML 配置中公开 WSDL 很简单(来自 Spring-WS 文档):

<bean id="orders" class="org.springframework.ws.wsdl.wsdl11.SimpleWsdl11Definition">
    <constructor-arg value="/WEB-INF/wsdl/Orders.wsdl"/>
</bean>

产生一个在以下位置公开 WSDL 的 URL:

http://localhost:8080/spring-ws/orders.wsdl

SimpleWsdl11Definition bean id +“.wsdl”在部署时成为 WSDL 的 URL 的叶子,它涵盖了单节点分类。

我需要支持公开具有多节点分类的 WSDL。

例如:

http://localhost:8080/spring-ws/domain/subdomain/foo.wsdl

这在 Spring-WS 中是如何实现的? Bean ID 属性不允许使用“/”字符,所以我想知道有哪些方法可以影响 WSDL URL。

注意:使用生成的 WSDL 将不会成为选项(出于向后一致性的原因),例如使用 DefaultWsdl11Definition。与 SimpleWsdl11Definition 一样,我想将对 WSDL 的请求映射到静态 WSDL。

谢谢。

【问题讨论】:

“多节点分类法”是什么意思? 单节点:*root*/leaf 多节点:*root*/branch/subbranch/leaf 【参考方案1】:

我遇到了同样的问题,暴露了具有不同 url 的两个版本的 web 服务。

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 映射配置到我的 bean 配置中的不同 wsdl 版本。

我更喜欢这种解决方案,因为它无需对任何 Spring 类进行子类化即可工作。

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】:

在查看了 spring-ws 源码后,发现不支持为静态来源的 WSDL 配置公开多节点路径。

所以我继承了 MessageDispatcherServlet 和 SimpleWsdl11Definition,并在我的 servlet 中提供了我自己的 WSDL 请求映射器,它支持现有的 WsdlDefinition bean,以及我的“位置指定”WsdlDefinition bean。

能够以这种方式进行配置:

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

一切都好。

【讨论】:

以上是关于Spring-WS:具有 WSDL 多节点分类的 SimpleWsdl11Definition的主要内容,如果未能解决你的问题,请参考以下文章

Spring-ws自动生成WSDL时生成java类的最佳方式

SPRING-WS CLIENT 端 WSDL 试用

Spring-ws 自动生成wsdl 修改请求默认Request后缀的问题

使用 Spring-WS 路由 WS-Addressing 响应

Drupal Views:获取与当前节点具有相同分类的节点

spring-ws:找不到端点映射