首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring-WS:带有WSDL多节点分类法的SimpleWsdl11Definition

Spring-WS:带有WSDL多节点分类法的SimpleWsdl11Definition
EN

Stack Overflow用户
提问于 2010-08-05 00:55:44
回答 2查看 6.4K关注 0票数 4

Spring-WS1.5:使用SimpleWsdl11Definition,在XML配置中公开WSDL非常简单(来自Spring-WS文档):

代码语言:javascript
运行
复制
<bean id="orders" class="org.springframework.ws.wsdl.wsdl11.SimpleWsdl11Definition">
    <constructor-arg value="/WEB-INF/wsdl/Orders.wsdl"/>
</bean>

生成一个URL,该URL在以下位置公开WSDL:

代码语言:javascript
运行
复制
http://localhost:8080/spring-ws/orders.wsdl

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

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

例如:

代码语言:javascript
运行
复制
http://localhost:8080/spring-ws/domain/subdomain/foo.wsdl

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

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

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-06 22:36:39

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

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

提供以这种方式进行配置的能力:

代码语言:javascript
运行
复制
<!-- 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>

平安无事。

票数 2
EN

Stack Overflow用户

发布于 2010-11-26 19:19:48

我在用不同的urls公开两个版本的with服务时也遇到了同样的问题。

代码语言:javascript
运行
复制
old version within http://hostname/ws.wsdl
new version within http://hostname/version/ws.wsdl

我的解决方案不是使用通用的wsdl,而是使用默认的org.springframework.web.servlet.DispatcherServlet,并在我的bean配置中配置到不同wsdl版本的url映射。

我更喜欢这个解决方案,因为它不需要子类化任何spring类就能工作。

web.xml:

代码语言:javascript
运行
复制
<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

代码语言:javascript
运行
复制
<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中配置的给定路径上公开。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3407855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档