2012-05-31 4 views
3

Я использую веб-службы Apache CXF и интеграцию Spring, и теперь я не могу вызвать приложение Spring Integration из конечной точки CXF.Как вызвать приложение Spring Integration из вашей конечной точки CXF

У меня есть опыт работы на Apache Camel и очень легко решить эту проблему ... но весной интеграции я не имеют ни малейшего представления ....

Мои строки кода являются:

  1. В веб-сервисы чёткости-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"/> 
    

Но когда я развернуть и вызвать веб-служб с клиентскими-веб-сервисов вернуть эту ошибку:

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

Вероятно, самый простой вариант заключается в настройке < шлюза >. Это позволяет вам предоставить любой интерфейс, который вы можете ввести в конечную точку, и вызвать его для инициирования потока сообщений. Под обложками интерфейс реализован так же, как и другие реализации «ProxyFactoryBean» весной (например, удаленный доступ через RMI, HttpInvoker и т. Д.).

Вот соответствующий раздел из справочника: http://static.springsource.org/spring-integration/docs/2.1.x/reference/htmlsingle/#gateway-proxy

+0

Я решил эту проблему, вдохновленный ваш ответ. Я создал обычные веб-службы cxf, и в ходе реализации я вызываю брандмауэр для маршрутизации сообщения запроса в моем потоке интеграции с интеграцией ... Это не очень хорошее решение, но оно работает нормально ...! – kikicarbonell

Смежные вопросы