2012-04-06 13 views
5

Sto provando a configurare un servizio Web SOAP esistente in Mule utilizzando i flussi del mulo. Ho un endpoint HTTP con richiesta/risposta e un componente SOAP, ad esempio Servizio A.Configurazione dell'endpoint HTTP con SOAP nei flussi del mulo

Simple SOAP flow Voglio configurare questa configurazione per un semplice flusso di lavoro. Ho impostato il mio endpoint HTTP e il servizio SOAP. Il file di flusso è mostrato sotto.

<?xml version="1.0" encoding="UTF-8"?> 

<mule xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:cxf="http://www.mulesoft.org/schema/mule/cxf" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:spring="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="CE-3.2.1" xsi:schemaLocation=" 
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd 
http://www.mulesoft.org/schema/mule/cxf http://www.mulesoft.org/schema/mule/cxf/current/mule-cxf.xsd 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd "> 
    <flow name="demoflowFlow1" doc:name="demoflowFlow1"> 
     <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" doc:name="HTTP"/> 
     <cxf:jaxws-service port="8082" serviceClass="com.myapp.serviceA.ServiceAImplService" doc:name="SOAP"/> 
    </flow> 
</mule> 

Questo non funziona. Il mio servizio è semplice e contiene una stringa e restituisce una stringa.

@WebService(targetNamespace = "http://service.demo.myapp.com/", endpointInterface = "com.myapp.demo.service.IServiceA", portName = "ServiceAImplPort", serviceName = "ServiceAImplService") 
public class ServiceAImpl implements IServiceA { 
    public String hello(String user) { 
     return "at service A: " + user; 
    } 
} 

sto invocando il mio flusso con l'URL http entrata http://localhost:8081/ {Non sono sicuro di quello che succede qui!} E ottenere:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
<soap:Body> 
<soap:Fault> 
<faultcode>soap:Server</faultcode> 
<faultstring>No such operation: (HTTP GET PATH_INFO: /)</faultstring> 
</soap:Fault> 
</soap:Body> 
</soap:Envelope> 

Il flusso Mulo è in esecuzione come un'applicazione in Mule Studio, e il servizio è in esecuzione come servizio Web SOAP dalla suite di strumenti di Springsource.

Cosa sto sbagliando?

WSDL originale a http://localhost:8080/ServiceA/services/ServiceAImplPort?wsdl

<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://service.demo.myapp.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="ServiceAImplService" targetNamespace="http://service.demo.myapp.com/"> 
<wsdl:types> 
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://service.demo.myapp.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<import namespace="http://service.demo.myapp.com/" schemaLocation="http://localhost:8080/ServiceA/services/ServiceAImplPort?xsd=serviceaimpl_schema1.xsd"/> 
</schema> 
</wsdl:types> 
<wsdl:message name="helloResponse"> 
<wsdl:part element="tns:helloResponse" name="parameters"></wsdl:part> 
</wsdl:message> 
<wsdl:message name="hello"> 
<wsdl:part element="tns:hello" name="parameters"></wsdl:part> 
</wsdl:message> 
<wsdl:portType name="IServiceA"> 
<wsdl:operation name="hello"> 
<wsdl:input message="tns:hello" name="hello"></wsdl:input> 
<wsdl:output message="tns:helloResponse" name="helloResponse"></wsdl:output> 
</wsdl:operation> 
</wsdl:portType> 
<wsdl:binding name="ServiceAImplServiceSoapBinding" type="tns:IServiceA"> 
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 
<wsdl:operation name="hello"> 
<soap:operation soapAction="urn:Hello" style="document"/> 
<wsdl:input name="hello"> 
<soap:body use="literal"/> 
</wsdl:input> 
<wsdl:output name="helloResponse"> 
<soap:body use="literal"/> 
</wsdl:output> 
</wsdl:operation> 
</wsdl:binding> 
<wsdl:service name="ServiceAImplService"> 
<wsdl:port binding="tns:ServiceAImplServiceSoapBinding" name="ServiceAImplPort"> 
<soap:address location="http://localhost:8080/ServiceA/services/ServiceAImplPort"/> 
</wsdl:port> 
</wsdl:service> 
</wsdl:definitions> 

FYI, posso eseguire il servizio web da SpringSource toolsuite senza problemi. Ora, come posso richiamare il servizio Web dal mio URL in entrata HTTP con una richiesta GET? [Presumo servizi web semplici come questi prendono GET richieste.]

+0

I servizi Web SOAP sono accessibili con POST not GET. Nel tuo caso, hai considerato di utilizzare un modello di servizio semplice invece di un flusso? http://www.mulesoft.org/documentation/display/MULE3USER/Simple+Service+Pattern –

+0

In realtà, non sono molto chiaro riguardo al consumo di un servizio web SOAP in un flusso. Una volta ottenuto questo problema, passerò a un flusso molto più complesso in cui ci sono chiamate parallele a più servizi e dovrò usare router di scelta mentre invoco anche alcuni servizi. Quindi, dovrò usare lo schema di flusso comunque. – r3st0r3

+0

Hai ragione: il modello di flusso è quello che ti serve. –

risposta

0

E 'molto facile ... immagino com.myapp.serviceA.ServiceAImplService è il vostro servizio classe di implementazione e IServiceA.java è la classe di servizio ... perché non provare questo: -

Mule Config

C'è qualcosa che non va nella vostra wsdl .... Perché < wsdl: service name = "ServiceAImplService"> è ServiceAImplService ... invece deve essere IServiceA .... ServiceAImplService è la classe di implementazione del servizio web immagino e deve essere conservato in in mulo scorro

2

Penso che hai dimenticato l'annotazione @WebMethod al vostro metodo. Questo è fondamentalmente ciò che il tuo errore dice: nessuna operazione.

Here è un ottimo esempio di come è possibile farlo.

@WebService(targetNamespace = "http://service.demo.myapp.com/", endpointInterface = "com.myapp.demo.service.IServiceA", portName = "ServiceAImplPort", serviceName = "ServiceAImplService") 
public class ServiceAImpl implements IServiceA { 
    @WebMethod 
    @WebResult(name="result") 
    public String hello(@WebParam(name="user")String user) { 
     return "at service A: " + user; 
    } 
} 
Problemi correlati