En mi anterior
publicación explicaba cómo exponer un servicio web en
Mule 2 usando
Apache Axis. Este servicio web tenía el método
helloAxis() el cuál recibía y devolvía cadenas de texto (
java.lang.String). En ésta parte 2 de mi publicación explico cómo exponer un servicio web usando objetos (beans) que no forman parte del API de
Java. Estos objetos son los siguientes:
Bean Field
package com.blogspot.ingmmurillo.axisws;
import java.io.Serializable;
public class Field implements Serializable{
private String name;
private String value;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public String toString() {
String result = "";
result += "" + name + "";
result += "" + value + "";
result += "";
return result;
}
}
Como se puede observar se sobreescribe el método
toString() usando tags
XML para mostrar el contenido de las variables de instancia del objeto. Además, es importante que los beans que se definan implementen la interface
java.io.Serializable.
Bean Message
package com.blogspot.ingmmurillo.axisws;
import java.io.Serializable;
public class Message implements Serializable {
private Field[] fields;
private String from;
private String to;
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public Field[] getFields() {
return fields;
}
public void setFields(Field[] fields) {
this.fields = fields;
}
@Override
public String toString() {
String result = "";
if (fields != null) {
if (fields.length > 0) {
for (Field f : fields) {
result += f;
}
}
}
result += "" + from + "";
result += "" + to + "";
result += "";
return result;
}
}
Como se puede observar este bean tiene un arreglo de objetos de tipo
Field. De igual forma se sobreescribe el método
toString() usando tags
XML.
Interface WSComplexDataTypes
package com.blogspot.ingmmurillo.axisws;
public interface WSComplexDataTypes {
public String sendMessage(Message msg);
}
La interface define el método
sendMessage() el cúal recibe como parámetro un objeto de tipo
com.blogspot.ingmmurillo.axisws.Message.
Clase WSComplexDataTypesImpl
package com.blogspot.ingmmurillo.axisws;
public class WSComplexDataTypesImpl implements WSComplexDataTypes {
public String sendMessage(Message msg) {
return msg.toString();
}
}
Esta clase contiene la implementación del método
sendMessage() el cual hace una llamada al método
toString() el cual fue redefinido para cada Bean. Cuando se invoque al servicio web se devolverá el contenido en
XML.
Configuración en Mule
<service name="wsComplexData">
<inbound>
<axis:inbound-endpoint
address="http://localhost:8282/webservices/axis"
serviceNamespace="http://ingmmurillo.blogspot.com/webservices/axis"
synchronous="true">
</axis:inbound-endpoint>
</inbound>
<component class="com.blogspot.ingmmurillo.axisws.WSComplexDataTypesImpl"/>
</service>
Pruebas
El servicio web será publicado en Mule bajo el siguiente URL:
http://localhost:8282/webservices/axis/wsComplexData?wsdl Obsérvese que el URL del servicio web se compone de la siguiente forma:
[address]/[service name]?wsdl
Se usó
soapUI v3.5 para realizar las pruebas de invocación al servicio web como se puede observar a continuación:
Nótese cómo se arma el
XML de invocación al servicio web:
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:axis="http://ingmmurillo.blogspot.com/webservices/axis" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<soapenv:Header/>
<soapenv:Body>
<axis:sendMessage soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<in0>
<fields>
<field>
<name>FirstName</name>
<value>Mauricio</value>
</field>
<field>
<name>LastName</name>
<value>Mauricio</value>
</field>
</fields>
<from>My Blog</from>
<to>The World</to>
</in0>
</axis:sendMessage>
</soapenv:Body>
</soapenv:Envelope>
Obteniéndose la siguiente respuesta del servicio web publicado en Mule:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<ns1:sendMessageResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://ingmmurillo.blogspot.com/webservices/axis">
<sendMessageReturn xsi:type="xsd:string"><![CDATA[<fields><field><name>Nombre</name><value>Mauricio</value></field><field><name>Apellido</name><value>Mauricio</value></field><from>Blog</from><to>El mundo</to></fields>]]></sendMessageReturn>
</ns1:sendMessageResponse>
</soapenv:Body>
</soapenv:Envelope>