2010-11-20 11 views
9

Nous créons un service web (basé CXF-) entraîné par une classe Java (Java2WS) avec la méthode suivante:Webservice avec CXF: Comment utiliser le 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); 
    } 

J'utilise les enveloppes pour définir les éléments de la demande de resp. réponse plus en détail: les noms d'éléments corrects (qui commencent par une majuscule), les éléments obligatoires et optionnels, ...). Mais je ne suis pas sûr que ce soit la bonne façon de le faire (il n'y a pas de documentation approfondie sur les emballages, est-ce pas?)

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

Actuellement, je ne comprends pas les wrappers. Lorsque je retourne une instance de MyReponse, comment les données de MyResponse sont-elles injectées dans MyResponseWrapper respectivement au corps SOAP de la réponse? En testant ce webservice, je peux voir qu'une instance de MyResponseWrapper est instanciée et que le corps SOAP contient les éléments corrects mais avec des données par défaut (par exemple: result = "fu" au lieu de "Hello"). Je m'attendais à ce que CXF injecte des données correspondantes de MyResponse à MyResponseWrapper. Est-ce faux?

Si c'est la mauvaise façon de le faire: Wat est le bon moyen de spécifier le xml SOAP résultant lors de l'utilisation de Java2WS? A propos: Les extraits de sources ci-dessus ne sont que des exemples tirés de nos classes plus complexes (plus de champs).

Répondre

-1

C'est la bonne façon de le faire. Les wrappers de requête et de réponse permettent simplement de remplacer l'espace de nom xml et les noms d'élément/attribut pour les éléments de requête/réponse; respectivement - qui à leur tour correspondent aux méthodes utilisées pour gérer ces valeurs.

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

L'annotation @RequestWrapper est définie par l'interface de javax.xml.ws.RequestWrapper. Il est placé sur les méthodes dans le SEI. Comme son nom l'indique, @RequestWrapper spécifie la classe Java qui implémente le bean wrapper pour les paramètres de méthode inclus dans le message de requête envoyé dans un appel distant. Il est également utilisé pour spécifier les noms d'éléments et les espaces de noms, utilisés par le runtime lors du marshalling et unmarshalling les messages de demande.

Le tableau suivant décrit les propriétés de l'annotation @RequestWrapper .

localName

Indique le nom local de l'élément d'emballage dans la représentation XML du message de demande. La valeur par défaut est le nom de la méthode ou la valeur de la propriété operationName de l'annotation @WebMethod .

targetNamespace

Indique l'espace de noms sous lequel l'élément d'emballage XML est défini . La valeur par défaut est l'espace de noms cible du SEI.

className

Indique le nom complet de la classe Java qui implémente l'emballage élément .

Questions connexes