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?
OriginalL'auteur Christian Strempfer | 2010-09-14
Vous devez vous connecter pour publier un commentaire.
Par défaut, votre service est EMBALLÉ, pas de NU, et donc l'élément de niveau supérieur dans le message doit être d'un type avec le même nom que l'opération. Dans les "classiques" de JAX-WS, cela vous oblige à ajouter un wrapper type.
Si vous utilisez Apache CXF, il va générer automatiquement ces gestionnaires avec l'ASM.
OriginalL'auteur bmargulies
Dans l'interface de service si vous avez une entrée:
avant la ajouter méthode dans le Calculateur d'interface, alors vous pouvez obtenir les classes wrapper créé par JAX-WS client à la volée en utilisant le code suivant:
OriginalL'auteur kaushik