3

私は Apache CXF Web サービスと Spring Integration を使用していますが、CXF エンドポイントから Spring Integration アプリケーションを呼び出す方法がわかりません。

私は Apache Camel で作業した経験があり、この問題を解決するのは非常に簡単です...しかし、Spring Integration ではわかりません....

私の回線コードは次のとおりです。

  1. webservices-definition-beans.xml 内:

    <!-- Load CXF modules from cxf.jar -->
    <import resource="classpath:META-INF/cxf/cxf.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
    
    <!--Exposing the HelloWorld service as a SOAP service -->
    <bean id="jaxbBean"
          class="org.apache.cxf.jaxb.JAXBDataBinding"
          scope="prototype"/>
    
    <bean id="jaxws-and-aegis-service-factory"
          class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean"
          scope="prototype">
        <property name="dataBinding" ref="jaxbBean"/>
        <property name="serviceConfigurations">
        <list>
            <bean class="org.apache.cxf.jaxws.support.JaxWsServiceConfiguration"/>
            <bean class="org.apache.cxf.aegis.databinding.AegisServiceConfiguration"/>
            <bean class="org.apache.cxf.service.factory.DefaultServiceConfiguration"/>
        </list>
    </property>
    </bean>
    
    <jaxws:endpoint id="helloWorld"
                serviceName="HelloWorldService"
                implementorClass="com.datys.cxf.HelloWorldService"
                address="/HelloWorld">
        <jaxws:serviceFactory>
            <ref bean="jaxws-and-aegis-service-factory"/>
        </jaxws:serviceFactory>
    </jaxws:endpoint> 
    
  2. service-definition-beans.xml 内:

    <gateway id="HelloWorldService" 
             default-request-channel="requestStrings"
             default-reply-channel="replyStrings"             
             service-interface="com.datys.cxf.HelloWorldService">
        <method name="sayHello"/>
    </gateway>
    
    <channel id="requestStrings"/>
    <channel id="replyStrings"/> 
    
    <!--<channel id="filesOut"/>-->
    <service-activator input-channel="requestStrings"
                       output-channel="filesOut"
                       ref="handler" method="handleString"/>
    
    <file:outbound-channel-adapter id="filesOut" 
                                   directory="file:D:/OUTPUT"/>
    
    <beans:bean id="handler" class="org.springframework.integration.samples.filecopy.Handler"/>
    

しかし、client-webservices を使用して Web サービスをデプロイして呼び出すと、次のエラーが返されます。

Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Could not instantiate service     class com.datys.cxf.HelloWorldService because it is an interface.
at com.sun.xml.internal.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:171)
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:94)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:240)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:210)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:103)
at $Proxy29.sayHello(Unknown Source)
4

1 に答える 1

3

おそらく最も簡単なオプションは、<gateway> を構成することです。これにより、エンドポイントに挿入できる任意のインターフェイスを提供し、それを呼び出してメッセージ フローを開始できます。内部では、インターフェースは、Spring の他の「ProxyFactoryBean」実装と同じ方法で実装されます (たとえば、RMI、HttpInvoker によるリモーティングなど)。

リファレンス マニュアルの関連セクションを次に示します: http://static.springsource.org/spring-integration/docs/2.1.x/reference/htmlsingle/#gateway-proxy

于 2012-05-31T20:04:00.523 に答える