2012-04-06 38 views
5

Estoy intentando configurar un servicio SOAP web existente en Mule usando Mule Flows. Tengo un punto final HTTP con solicitud/respuesta y un componente SOAP, por ejemplo, Servicio A.Configurar el punto final HTTP con SOAP en Mule Flows

Simple SOAP flow Quiero configurar esta configuración para que un flujo simple funcione. Establecí mi punto final HTTP y el servicio SOAP. El archivo de flujo se muestra a continuación.

<?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> 

Esto no está funcionando. Mi servicio es simple y toma una cadena y devuelve una cadena.

@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; 
    } 
} 

invoco mi flujo con la URL HTTP entrante http://localhost:8081/ {No estoy seguro de lo que va aquí!} Y conseguir:

<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> 

El flujo mula se ejecuta como una aplicación en la mula de estudio, y el servicio se está ejecutando como un servicio web SOAP de Springsource Toolsuite.

¿Qué estoy haciendo mal?

WSDL original en 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, puede ejecutar el servicio web de SpringSource ToolSuite sin problemas. Ahora, ¿cómo invoco el servicio web desde mi URL HTTP entrante con una solicitud GET? [supongo servicios web simples como estos toman peticiones GET.]

+0

Se accede a los servicios web SOAP con POST not GET. En su caso, ¿ha considerado utilizar un patrón de servicio simple en lugar de un flujo? http://www.mulesoft.org/documentation/display/MULE3USER/Simple+Service+Pattern –

+0

En realidad, no soy muy claro acerca de consumir un servicio web SOAP en un flujo. Una vez que obtenga esta pat, pasaré a un flujo mucho más complejo donde haya llamadas paralelas a múltiples servicios y tendré que usar enrutadores de elección al invocar también algunos servicios. Entonces, tendré que usar el patrón de flujo de todos modos. – r3st0r3

+0

Tiene razón: el patrón de flujo es lo que necesita. –

Respuesta

0

Es muy fácil ... supongo com.myapp.serviceA.ServiceAImplService es la clase de implementación del servicio y IServiceA.java es la clase de servicio ... ¿por qué no intenta esto: -

Mule Config

Hay algo mal en su WSDL .... ¿por qué < wsdl: service name = "ServiceAImplService"> es ServiceAImplService ... en vez de eso debe ser IServiceA .... ServiceAImplService es la clase de implementación del servicio web, supongo y debe mantenerse en el flujo de mula

2

Creo que olvidó la anotación @WebMethod en su método. Esto es básicamente lo que dice tu error: Sin operación.

Here es un muy buen ejemplo de cómo puede hacerlo.

@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; 
    } 
} 
Cuestiones relacionadas