Java-Artefakte für JAX-WS-Anwendungen generieren
Verwenden Sie JAX-WS-Tools (Java™ API for XML-Based Web Services), um die erforderlichen JAX-WS- und JAXB-Java-Artefakte zu generieren, die für JAX-WS-Web-Service-Anwendungen erforderlich sind, wenn sie über JavaBeans- oder Enterprise-Bean-Komponenten gestartet werden.
Vorbereitende Schritte
Informationen zu diesem Vorgang
- JAXB-Klassen, die für das Marshaling und Unmarshaling des Nachrichteninhalts erforderlich sind.
- Eine WSDL-Datei, wenn das optionale Argument -wsdl angegeben ist.


Wenn Sie den Bottom-up-Ansatz mit JavaBeans als Ausgangspunkt verwenden, müssen Sie beim Entwickeln von JAX-WS-Web-Services keine WSDL-Datei entwickeln. Durch die Verwendung von Annotationen werden alle WSDL-Informationen bereitgestellt, die zum Konfigurieren des Serviceendpunkts oder Clients erforderlich sind. Der Anwendungsserver unterstützt WSDL-Dokumente der Version 1.1, die der Spezifikation "Web Services-Interoperability (WS-I) Basic Profile 1.1" entsprechen und entweder Document/Literal-Dokumente oder RPC/Literal-Dokumente sind. Außerdem werden WSDL-Dokumente mit Bindungen unterstützt, die ein Attribut USE mit dem Wert LITERAL deklarieren. Der Wert ENCODED wird jedoch nicht unterstützt. Für WSDL-Dokumente, die ein eingeschlossenes Muster vom Typ "Document/Literal" implementiert, wird im XML-Schema ein Stammelement deklariert und als Operations-Wrapper für eine Nachrichtenfolge verwendet. Für Anforderung und Antwort sind gesonderte Wrapper-Elementdefinitionen vorhanden.
Um sicherzustellen, dass der Befehl wsgen keine übernommenen Methoden in der Implementierungsklasse eines Serviceendpunkts auslässt, müssen Sie der gewünschten Superklasse die Annotation "@WebService" hinzufügen oder die übernommene Methode in der Implementierungsklasse durch einen Aufruf der Methode aus der Superklasse überschreiben.
Obwohl eine WSDL-Datei (Web Services Description Language) bei der Entwicklung einer JAX-WS-Serviceimplementierungsbean gewöhnlich optional ist, muss sie jedoch erstellt werden, wenn Ihre JAX-WS-Endpunkte über den Transport "SOAP over JMS" bereitgestellt werden und wenn Sie Ihre WSDL-Datei veröffentlichen. Wenn Sie eine EJB-Serviceimplementierungsbean entwickeln, die über den Transport "SOAP over JMS" aufgerufen wird, und die WSDL-Datei veröffentlichen möchten, damit die veröffentlichte WSDL-Datei den vollständig aufgelösten JMS-Endpunkt-URL enthält, generieren Sie die WSDL-Datei mit dem Tool wsgen, und geben Sie das Argument -wsdl an. In diesem Szenario müssen Sie die WSDL-Datei mit Ihrer Web-Service-Anwendung packen.
Sie können diese JAX-WS-Tools nicht nur über die Befehlszeile, sondern auch in den Ant-Build-Umgebungen aufrufen. Verwenden Sie die Ant-Task com.sun.tools.ws.ant.WsGen in der Ant-Build-Umgebung, um das Tool "wsgen" aufzurufen. Damit diese Ant-Task richtig ausgeführt wird, müssen Sie Ant mit dem Script "ws_ant" aufrufen.
Vorgehensweise
Ergebnisse
Sie haben die erforderlichen Java-Artefakte für die Erstellung eines JAX-WS-Web-Service generiert.

Error: Two classes have the same XML type name ....
Use @XmlType.name and @XmlType.namespace to assign different names to them...
Diese Fehlernachricht zeigt an, dass Sie Klassen
oder @XMLType.name-Werte mit demselben Namen haben, die sich jedoch in verschiedenen Java-Paketen befinden. Fügen Sie zur Vermeidung dieses Fehlers
die Klasse "@XML.Type.namespace" zur vorhandenen Annotation "@XMLType" hinzu, um die Unterscheidung zwischen den XML-Typen zu ermöglichen. gotchaBei JAX-WS-Anwendungen ist das Befehlszeilentool wsgen möglicherweise nicht in der Lage, gemeinsam genutzte Klassendateien zu lokalisieren. Sie können die Position dieser Klassendateien mit der angepassten Eigenschaft com.ibm.websphere.webservices.WSDL_Generation_Extra_ClassPath angeben. Weitere Informationen finden Sie in der Dokumentation zu den angepassten Eigenschaften der Java Virtual Machine.
Beispiel
- Kopieren Sie die Beispielklassendatei EchoServicePortTypeImpl für die Serviceimplementierung
und die zugehörige Klassendatei EchoServicePortType der Serviceschnittstelle
in ein Verzeichnis. Das Verzeichnis muss eine Verzeichnisstruktur enthalten, die dem Paketnamen
com.ibm.was.wssample.echo für die Klassendatei entspricht.
/* Dies ist ein Beispiel für die Datei EchoServicePortTypeImpl.java. */ package com.ibm.was.wssample.echo; @javax.jws.WebService(serviceName = "EchoService", endpointInterface = "com.ibm.was.wssample.echo.EchoServicePortType", targetNamespace="http://com/ibm/was/wssample/echo/", portName="EchoServicePort") public class EchoServicePortTypeImpl implements EchoServicePortType { public EchoServicePortTypeImpl() { } public String invoke(String obj) { System.out.println(">> JAXB Provider Service: Request received.\n"); String str = "Failed"; if (obj != null) { try { str = obj; } catch (Exception e) { e.printStackTrace(); } } return str; } }
/* Dies ist ein Beispiel für die Datei EchoServicePortType.java. */ package com.ibm.was.wssample.echo; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.xml.ws.RequestWrapper; import javax.xml.ws.ResponseWrapper; @WebService(name = "EchoServicePortType", targetNamespace = "http://com/ibm/was/wssample/echo/", wsdlLocation="WEB-INF/wsdl/Echo.wsdl") public interface EchoServicePortType { /** * * @param arg0 * @return * returns java.lang.String */ @WebMethod @WebResult(name = "response", targetNamespace = "http://com/ibm/was/wssample/echo/") @RequestWrapper(localName = "invoke", targetNamespace = "http://com/ibm/was/wssample/echo/", className = "com.ibm.was.wssample.echo.Invoke") @ResponseWrapper(localName = "echoStringResponse", targetNamespace = "http://com/ibm/was/wssample/echo/", className = "com.ibm.was.wssample.echo.EchoStringResponse") public String invoke( @WebParam(name = "arg0", targetNamespace = "http://com/ibm/was/wssample/echo/") String arg0); }
- Führen Sie den Befehl wsgen im Verzeichnis "Stammverzeichnis_des_Anwendungsservers\bin\" aus.
Die Option -cp gibt die Position der Klassendatei für die Serviceimplementierung an.
Die Option -s gibt das Verzeichnis für die generierten Quellendateien an.
Die Option -d gibt das Verzeichnis für die generierten Ausgabedateien an.
Wenn Sie die Option -s oder -d verwenden, müssen Sie zuerst das Verzeichnis
für die generierten Ausgabedateien erstellen.
Stammverzeichnis_des_Anwendungsservers\bin\wsgen.bat -wsdl -s c:\generated_source\ -cp c:\my_application\classes\ com.ibm.was.wssample.echo.EchoServicePortTypeImpl -verbose -d c:\generated_artifacts\
Führen Sie den Befehl wsgen aus. Beispiel:
Stammverzeichnis_des_Anwendungsservers/bin/wsgen.sh -wsdl -s c:/generated_source/ -cp c:/my_application/classes/ com.ibm.was.wssample.echo.EchoServicePortTypeImpl -verbose -d c:/generated_artifacts/
/generated_source/com/ibm/was/wssample/echo/EchoStringResponse.java
/generated_source/com/ibm/was/wssample/echo/Invoke.java
/generated_artifacts/EchoService.wsdl
/generated_artifacts/EchoService_schema1.xsd
/generated_artifacts/com/ibm/was/wssample/echo/EchoStringResponse.class
/generated_artifacts/com/ibm/was/wssample/echo/Invoke.class
Die Dateien "EchoStringResponse.java" und "Invoke.java" sind die generierten Java-Klassendateien. Die kompilierten Versionen der generierten Java-Dateien sind "EchoStringResponse.class" und "Invoke.class". Die Dateien "EchoService.wsdl" und "EchoService_schema1.xsd" wurden generiert, weil die Option -wsdl angegeben wurde.
Nächste Schritte
Vervollständigen Sie die Implementierung Ihrer JAX-WS-Web-Service-Anwendung.