2012-05-31 27 views
3

我正在使用Apache CXF Web服务和Spring集成,现在我还没有如何从您的CXF端点调用Spring集成应用程序。如何从您的CXF端点调用Spring集成应用程序

我有工作经验的Apache的骆驼,是很容易解决这个问题...但在Spring Integration的我没有任何想法....

我行代码是:

  1. 在Web服务定义-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. 在服务定义-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"/> 
    

但是当我部署和客户端Web服务调用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) 

回答

3

也许最简单的办法是配置一个<网关>。这使您可以提供任何可以注入到端点并调用它来启动消息流的接口。在封面下,接口的实现方式与Spring中其他“ProxyFactoryBean”实现相同(例如,通过RMI,HttpInvoker等进行远程处理)。

下面是从参考手册中相关章节: http://static.springsource.org/spring-integration/docs/2.1.x/reference/htmlsingle/#gateway-proxy

+0

我解决了这个问题,通过你的答案启发。我创建了普通的cxf web服务,并且在实现中,我调用网关bean来在我的spring集成流程中路由请求消息...这不是一个漂亮的解决方案,但它工作正常...! – kikicarbonell

相关问题