3

spring-ws を使用して Web サービス (サーバー側) を実装しています。spring-integration-ws (ws:inbound-gateway and channels) を使用するようにコードを変更したいと思います。例を試してみましたが、実装を変換できるかどうかはまだわかりません。つまり、@Endpoint、@PayloadRoot、PayloadRootAnnotationMethodEndpointMapping、および JMS (トランスポートとして) を使用しています。私の実装の下に見つけてください:

エンドポイント クラス (MyEndpoint.java):

@Endpoint
public class MyEndpoint {
    @PayloadRoot(localPart="getUserRequest", namespace="http://play.zahid.springint/Jibx")
    public GetUserResponse getUserResponse(GetUserRequest request){
        log.info("Start getUserResponse " + request);
        GetUserResponse response = new GetUserResponse();

        User user = new User();
        user.setFirstName(request.getFirstName());
        user.setLastName(request.getFirstName() + " Last");
        response.setUser(user);

        log.info("End getUserResponse " + response);
        return response;
    }

    @PayloadRoot(localPart="sayHiUserRequest", namespace="http://play.zahid.springint/Jibx")
    public SayHiResponse sayHiUserResponse(SayHiUserRequest request){
        log.info("Start sayHiUserResponse " + request);
        SayHiUserResponse response = new SayHiUserResponse();

        response.setResponse("Hi " + request.getFirstName() + " " + request.getLastName());

        log.info("End sayHiUserResponse " + response);
        return response;
    }   
}

春の xml ファイル (applicationContext.xml):

<bean id="listenerContainer"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="mqCachedConnectionFactory" />
        <property name="destination" ref="defaultDestination" />
        <property name="messageListener">
            <bean class="org.springframework.ws.transport.jms.WebServiceMessageListener">
                <property name="messageFactory" ref="messageFactory"/>
                <property name="messageReceiver" ref="messageReceiver" />
            </bean>
        </property>
        <property name="concurrentConsumers" value="1" />
        <property name="acceptMessagesWhileStopping" value="false" />
        <property name="recoveryInterval" value="10000" />
        <property name="cacheLevelName" value="CACHE_CONSUMER" />
    </bean>

    <bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory" />    

    <bean id="messageReceiver" class="org.springframework.ws.soap.server.SoapMessageDispatcher">
        <property name="endpointAdapters">
            <list>
                <bean id="endpointAdapter" class="org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter">
                    <constructor-arg ref="marshaller" />
                </bean>
            </list>
        </property>         
    </bean>

    <bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping" />

簡単にするために、不要なコードと xml 構成を削除しました。

エンドポイント クラス (MyEndpoint.java) をそのままにして、spring-integration-ws サポート (ws:inbound-gateway とチャネル) を使用する方法はありますか?

さらに情報が必要な場合はお知らせください。

ありがとう

4

1 に答える 1

0

エンドポイント クラス (MyEndpoint.java) をそのままにして、spring-integration-ws サポート (ws:inbound-gateway とチャネル) を使用する方法はありますか?

はい、できます。

あなたの状況に合わせた簡単な統合 ws の実装を説明しようと思います。

applicationContext.xml:

<bean id="endpointMappings"
        class="org.springframework.beans.factory.config.ListFactoryBean"
        lazy-init="true">
        <property name="sourceList">
            <list>
                <ref bean="uriEndpointMapping"/>
            </list>
        </property>
</bean>

<bean id="uriEndpointMapping"
        class="org.springframework.ws.server.endpoint.mapping.UriEndpointMapping"
        p:defaultEndpoint-ref="ws-inbound-gateway">
        <property name="mappings">
            <props>
                <prop key="${yourEndPointUrl}">ws-inbound-gateway</prop>
            </props>
        </property>
</bean>

<int-ws:inbound-gateway id="ws-inbound-gateway"
                        request-channel="ws-request-channel"
                        reply-channel="ws-response-channel"
                        error-channel="ws-error-channel"
                        marshaller="marshaller"
                        unmarshaller="marshaller"/>

<int:channel id="ws-request-channel"/>
<int:channel id="ws-response-channel"/>
<int:channel id="ws-error-channel"/>

<int:chain input-channel="ws-request-channel" output-channel="ws-response-channel">
    <int:service-activator ref="yourBean" method="getUserResponse"/>
</int:chain>

ここにいくつかのポイントがあります。Bean、MyEndpoint タイプを定義する必要があります。ここではyourBeanと名付けました。
yourEndPointUrlは、 getUserResponseメソッドのエンドポイント URL を定義します。
チェーン内に service-activator を定義しました。このチェーン内にロギングなどを追加して、処理メカニズムを充実させることができます。
また、Bean のさまざまなメソッドにリクエストをルーティングするためのルーターも必要です。

于 2013-07-04T14:42:53.623 に答える