style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

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

//Interfaz

@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:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
   <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:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <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

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

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

@XmlAccessorType(XmlAccessType.FIELD)
@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;
        }
               
}

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">