Web service con Apache CXF
Hola buenos días, tengo un web service con un servicio en Apache CXF, el problema que tengo es que dicho servicio regresa un objecto complejo y al momento de consumirlo en el soap UI para ver el resultado este no me muestra el xml esperado.
Este es el código que tengo
@WebService(endpointInterface = "ws")
public interface ws{
@WebMethod(operationName="Busqueda")
public Result GetBusqueda(@WebParam(name="uidProd") String uidProd,@WebParam(name="uidSubProd") String uidSubProd);
}
//La implementación
public Result GetBusqueda(String uidProd, String uidSubProdp)
{
//Inicializo mis objetos
Result sr = new Result();
HeadGrid head = new HeadGrid();
ArrayList<BodyGrid> vbody = new ArrayList<BodyGrid>();
Resultado result = new Resultado();
head.setHead("ABRIR");
head.setHead("BLOQUEADO/DESBLOQUEADO");
head.setHead("SOLICITUD");
//Este while es el resultado de una consulta a base de datos
while(resultado.next())
{
BodyGrid ibody = new BodyGrid();
ibody.setBody(resultado.getString("valor1"));
ibody.setBody(resultado.getString("valor2"));
ibody.setBody(resultado.getString("valor3"));
vbody.add(ibody);
}
sr.setHead(head);
sr.setiBody(vbody);
result.setCodigo("0000");
result.setMensaje("Transaccion Exitosa");
sr.setResultado(result);
return sr;
}
// Clase HeadGrid
public class HeadGrid
{
//Utilizo ArrayList porque no se el numero de elementos que se van a regresar
ArrayList<String> head = new ArrayList<String>();
public ArrayList<String> getHead() {
return head;
}
public void setHead(String head) {
this.head.add(head);
}
}
// Clase BodyGrid
public class BodyGrid {
//Utilizo ArrayList porque no se el numero de elementos que se van a regresar
ArrayList<String> body = new ArrayList<String>();
public ArrayList<String> getBody() {
return body;
}
public void setBody(String body) {
this.body.add(body);
}
}
//Clase Resultado
public class Resultado {
String codigo;
String mensaje;
public String getCodigo() {
return codigo;
}
public void setCodigo(String codigo) {
this.codigo = codigo;
}
public String getMensaje() {
return mensaje;
}
public void setMensaje(String mensaje) {
this.mensaje = mensaje;
}
}
//Clase Result
public class Result
{
HeadGrid head;
ArrayList<BodyGrid> ibody;
Resultado resultado;
public HeadGrid getHead() {
return head;
}
public void setHead(HeadGrid head) {
this.head = head;
}
public ArrayList<BodyGrid> getiBody() {
return ibody;
}
public void setiBody(ArrayList<BodyGrid> ibody) {
this.ibody = ibody;
}
public Resultado getResultado() {
return resultado;
}
public void setResultado(Resultado resultado) {
this.resultado = resultado;
}
}
El resultado que espero es:
<soapenv:Body>
<ns:GetBusquedaResponse xmlns:ns="http://ws.paquete.com">
<ns:return xsi:type="ax21:SearchResult" xmlns:ax21="http://obj.paquete.com/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ax21:head xsi:type="ax21:HeadGrid">
<ax21:head>S/H</ax21:head>
<ax21:head>S/H</ax21:head>
....
</ax21:head>
<ax21:iBody>
<ax21:body>S/B</ax21:body>
....
</ax21:iBody>
<ax21:iBody>
<ax21:body>S/B</ax21:body>
....
</ax21:iBody>
<ax21:resultado xsi:type="ax21:Resultado">
<ax21:codigo>0040</ax21:codigo>
<ax21:mensaje>Transacción Exitosa</ax21:mensaje>
</ax21:resultado>
</ns:return>
</ns:GetBusquedaResponse>
</soapenv:Body>
</soapenv:Envelope>
El resultado anterior me lo regresa el mismo web service pero con Axis.
El resultado que me regresa con Apache CXF es :
<soap:Body>
<ns2:GetBusquedaResponse xmlns:ns2="http://ws.paquete.com/">
<return>
<head/>
<resultado>
<codigo>0040</codigo>
<mensaje>Transaccion Exitosa</mensaje>
</resultado>
<iBody/>
</return>
</ns2:GetBusquedaResponse>
</soap:Body>
</soap:Envelope>
Las pruebas se hicieron con los mismos datos, pero en el caso de Apache CXF no me regresa <head/> y <iBody/>
No se si me hace falta algo o porque razón este pasando esto, si tienen una idea se los agradeceria
Saludos
- Inicie sesión o regístrese para enviar comentarios
Resuelto
Despues de leer la documentación del Apache CXF http://cxf.apache.org/docs/defining-contract-first-webservices-with-wsdl... puede dar con la solución al problema.
Es agregar las etiquetas correspondientes en las clases objeto
@XmlAccessorType
@XmlType
@XmlType(name = "Result")
public class Result
{
@XmlElement(name="head")
HeadGrid head;
@XmlElement(name="ibody")
ArrayList<BodyGrid> ibody;
@XmlElement(name="resultado")
Resultado resultado;
public HeadGrid getHead() {
return head;
}
public void setHead(HeadGrid head) {
this.head = head;
}
public ArrayList<BodyGrid> getiBody() {
return ibody;
}
public void setiBody(ArrayList<BodyGrid> ibody) {
this.ibody = ibody;
}
public Resultado getResultado() {
return resultado;
}
public void setResultado(Resultado resultado) {
this.resultado = resultado;
}
}