2010-11-20 15 views
9

Creiamo un webservice (CXF-based) azionata da una classe java (Java2WS) con il seguente metodo:Webservice con CXF: come utilizzare 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 le involucri per definire gli elementi della richiesta risp. risposta in maggiore dettaglio: i nomi degli elementi corretti (che iniziano con un carattere maiuscolo), elementi obbligatori e facoltativi, ...). Ma io non sono sicuro se questo è il modo giusto per farlo (non v'è alcuna documentazione approfondita su involucri, non è vero?)

Il MyResponse classe:

public class MyResponseWrapper { 

    private String result; 
    private ModeEnum status; 

    // getters and setters 
} 

La classe MyReponseWrapper

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

Attualmente non capisco i wrapper. Quando restituisco un'istanza di MyReponse, come vengono inviati i dati di MyResponse in MyResponseWrapper in modo rispettivo al corpo SOAP della risposta?

Testando questo servizio Web, è possibile visualizzare un'istanza di MyResponseWrapper e il corpo SOAP contiene gli elementi corretti ma con dati predefiniti (ad esempio: risultato = "fu" anziché "Ciao"). Mi aspettavo che CXF inietti i dati corrispondenti da MyResponse a MyResponseWrapper. È sbagliato?

Se questo è il modo sbagliato per farlo: Wat è il modo giusto per specificare il xml SOAP risultante quando si utilizza Java2WS?

A proposito: i frammenti di codice di cui sopra sono solo esempi tratti dalle nostre classi più complesse (più campi).

risposta

-1

Questo è il modo giusto per farlo. I wrapper di richiesta e risposta consentono solo di sovrascrivere lo spazio dei nomi xml e i nomi di elementi/attributi per gli elementi richiesta/risposta; rispettivamente - che a loro volta mappano i metodi usati per gestire quei valori.

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

L'annotazione @RequestWrapper è definito dall'interfaccia javax.xml.ws.RequestWrapper. È posto sui metodi in il SEI. Come suggerisce il nome, @RequestWrapper specifica la classe Java che implementa il bean wrapper per i parametri del metodo che sono inclusi nel messaggio di richiesta inviato in una chiamata remota. È utilizzato anche per specificare i nomi degli elementi e gli spazi dei nomi, utilizzati dal runtime durante il marshalling e lo smantellamento dei messaggi di richiesta.

La seguente tabella descrive le proprietà dell'annotazione @RequestWrapper .

localName

Specifica il nome locale dell'elemento involucro nella rappresentazione XML del messaggio di richiesta. Il valore predefinito è il nome del metodo o il valore della proprietà operationName dell'annotazione @WebMethod .

targetNamespace

Specifica lo spazio dei nomi in cui l'elemento wrapper XML è definita. Il valore predefinito è lo spazio dei nomi di destinazione del SEI.

className

Specifica il nome completo della classe Java che implementa l'involucro elemento.

Problemi correlati