4

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属性では「/」文字を使用できないため、WSDLURLに影響を与える方法は何か疑問に思います。

注:生成されたWSDLを使用することは、たとえばDefaultWsdl11Definitionの場合、オプションではありません(後方整合性の理由から)。SimpleWsdl11Definitionと同様に、WSDLのリクエストを静的WSDLにマップしたいと思います。

ありがとう。

4

2 に答える 2

5

URLが異なる2つのバージョンの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を使用し、Bean構成でさまざまなwsdlバージョンへのURLマッピングを構成していました。

このソリューションは、スプリングクラスをサブクラス化せずに機能するため、私はこのソリューションを好みます。

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で構成された特定のパスで公開されます。

于 2010-11-26T11:19:48.217 に答える
2

spring-wsソースを調べたところ、静的ソースのWSDL構成のマルチノードパスを公開するためのサポートがないことがわかりました。

そこで、MessageDispatcherServletとSimpleWsdl11Definitionをサブクラス化し、サーブレットで、既存のWsdlDefinitionBeanと「場所指定」のWsdlDefinitionBeanをサポートする独自のWSDL要求マッパーを提供しました。

この種の方法で構成する機能を提供します。

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

すべては順調です。

于 2010-08-06T14:36:38.800 に答える