2010-11-20 29 views
9

Estamos creando un servicio web (basado en CXF) accionado por una clase Java (Java2WS) con el siguiente método:Servicio web con CXF: cómo usar ResponseWrapper?

@WebMethod 
    @RequestWrapper(className = "com.myproject.wrapper.MyRequestWrapper") 
    @ResponseWrapper(className = "com.myproject.wrapper.MyResponseWrapper") 
    public MyResponse verifyCode(@WebParam(name = "code") String code) { 
    ... 
    return new MyResponse("Hello",StatusEnum.okay); 
    } 

uso el envolturas para definir los elementos de la solicitud resp. respuesta con más detalle: los nombres correctos de los elementos (que comienzan con un carácter en mayúscula), elementos requeridos y opcionales, ...). Pero no estoy seguro de si esta es la forma correcta de hacerlo (no hay documentación detallada acerca de las envolturas, ¿verdad?)

El MyResponse clase:

public class MyResponseWrapper { 

    private String result; 
    private ModeEnum status; 

    // getters and setters 
} 

El MyReponseWrapper clase

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "myResponse") 
public class MyResponseWrapper { 

    @XmlElement(name="Result") 
    private String result; 

    @XmlElement(name = "Status") 
    private StatusEnum status; 

    public MyResponseWrapper() { 
    result="fu"; // just for testing 
    } 

    // getters and setters 
} 

Actualmente no entiendo los Wrappers. Cuando devuelvo una instancia de MyReponse, ¿cómo se inyectan los datos de MyResponse en MyResponseWrapper respec- tivamente al cuerpo SOAP de la respuesta?

Al probar este servicio web puedo ver que una instancia de MyResponseWrapper se crea una instancia y el cuerpo SOAP contiene los elementos correctos pero con datos predeterminados (por ejemplo: result = "fu" en lugar de "Hello"). Esperé que CXF inyecta datos coincidentes desde MyResponse a MyResponseWrapper. ¿Es eso incorrecto?

Si esta es la manera incorrecta de hacerlo: Wat es la manera correcta de especificar el xml de SOAP resultante al usar Java2WS?

Por cierto: los fragmentos de código fuente anteriores son solo ejemplos tomados de nuestras clases más complejas (más campos).

Respuesta

-1

Esta es la forma correcta de hacerlo. Las envolturas de solicitud y respuesta solo permiten anular el nombre de espacio xml y los nombres de elemento/atributo para los elementos de solicitud/respuesta; respectivamente, que a su vez se asignan a los métodos utilizados para gestionar esos valores.

Ref: http://cxf.apache.org/docs/developing-a-service.html#[email protected]

La anotación @RequestWrapper está definida por la interfaz javax.xml.ws.RequestWrapper. Se coloca en los métodos en el SEI. Como su nombre lo indica, @RequestWrapper especifica la clase Java que implementa el bean contenedor para los parámetros de método que están incluidos en el mensaje de solicitud enviado en una invocación remota. Es , también se utiliza para especificar los nombres de los elementos y los espacios de nombres, utilizados por el tiempo de ejecución al ordenar y desasignar los mensajes de solicitud.

La siguiente tabla describe las propiedades de la anotación @RequestWrapper .

localName

Especifica el nombre local del elemento contenedor en la representación XML del mensaje de solicitud. El valor predeterminado es el nombre del método o el valor de la propiedad operationName de la anotación @WebMethod.

targetNamespace

Especifica el espacio de nombres bajo los cuales el elemento de envoltura XML es definido. El valor predeterminado es el espacio de nombres de destino del SEI.

className

Especifica el nombre completo de la clase Java que implementa el elemento de envoltura.

Cuestiones relacionadas