Pourquoi ne JAX-WS besoin classes wrapper?

J'ai créé un simple service web, qui met en œuvre une opération d'ajout, et a créé des fichiers clients avec wsimport. Maintenant, je veux inclure le moins possible wsdl spécifiques des artefacts. Voici un exemple de la façon dont le service web sera appelé:

String serviceNamespace = "http://jws.samples.geronimo.apache.org/";
String serviceName = "CalculatorServiceService";
QName serviceQN = new QName(serviceNamespace, serviceName);
Service service = Service.create(new URL("http://localhost:8080/WebService/calculator?wsdl"), serviceQN);

String portNamespace = "http://jws.samples.geronimo.apache.org/";
String portName = "CalculatorServicePort";
QName portQN = new QName(portNamespace, portName);
Calculator myProxy = (Calculator) service.getPort(portQN, Calculator.class);

Mais il semble que j'ai pour inclure les classes wrapper pour chaque message. Par exemple le message de résultat de l'opération d'ajout:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "addResponse", propOrder = { "_return" })
public class AddResponse {
    @XmlElement(name = "return")
    protected int _return;
    public int getReturn() {
        return _return;
    }
    public void setReturn(int value) {
        this._return = value;
    }
}

Ces wrappers sont utilisés dans les annotations dans l'interface de service:

@WebService(name = "Calculator", targetNamespace = "http://jws.samples.geronimo.apache.org/")
public interface Calculator {
    @WebMethod
    @RequestWrapper(className = "org.example.webservices.clients.dynamicproxy.Add")
    @ResponseWrapper(className = "org.example.webservices.clients.dynamicproxy.AddResponse")
    public int add(
        @WebParam(name = "value1", targetNamespace = "")
        int value1,
        @WebParam(name = "value2", targetNamespace = "")
        int value2);
}

Si les annotations sont supprimés, le service web ne fonctionne pas.

com.soleil.xml.ws.de modèle.RuntimeModelerException: le temps d'exécution modeleur d'erreur: classe Wrapper org.exemple.webservices.clients.dynamicproxy.jaxws.Ajouter n'est pas trouvé. Avez-vous lancer APT de les générer?

Mais pourquoi ai-je besoin de ces wrappers? Ne pouvait pas JAX-WS créer ces wrappers à la volée? Voyez-vous des informations qui ne pouvaient pas être récupérés à partir du fichier wsdl?

Trouvé un document qui vaut la peine de lire. pic.dhe.ibm.com/infocenter/wasinfo/v7r0/...

OriginalL'auteur Christian Strempfer | 2010-09-14