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

bug*_*g11 4 java wsdl web-services spring-ws

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

<bean id="orders" class="org.springframework.ws.wsdl.wsdl11.SimpleWsdl11Definition">
    <constructor-arg value="/WEB-INF/wsdl/Orders.wsdl"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

产生一个公开WSDL的URL:

http://localhost:8080/spring-ws/orders.wsdl
Run Code Online (Sandbox Code Playgroud)

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

我需要支持具有多节点分类法的WSDL的暴露.

例如:

http://localhost:8080/spring-ws/domain/subdomain/foo.wsdl
Run Code Online (Sandbox Code Playgroud)

这是如何在Spring-WS中完成的?Bean ID属性不允许使用"/"字符,因此我想知道影响WSDL URL的方式是什么.

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

谢谢.

vvu*_*rsT 5

我遇到了同样的问题,暴露了两个版本的webservice与不同的网址.

old version within http://hostname/ws.wsdl
new version within http://hostname/version/ws.wsdl
Run Code Online (Sandbox Code Playgroud)

我的解决方案不是使用通用的org.springframework.ws.transport.http.MessageDispatcherServletservlet,而是使用默认的org.springframework.web.servlet.DispatcherServlet,并在我的bean配置中配置url映射到不同的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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

因此,每个wsdl都在SimpleUrlHandlerMapping-Bean中配置的给定路径上公开.