Methoden in SEI-basierten JAX-WS-Web-Services bereitstellen
Sie können die Annotationen @WebService und @WebMethod in einer Serviceendpunktimplementierung (SEI) verwenden, um Java™-Methoden anzugeben, die als JAX-WS-Web-Services (Java API for XML-Based Web Services) bereitgestellt werden sollen.
Vorbereitende Schritte
Die JAX-WS-Technologie ermöglicht die Implementierung von Web-Services auf der Basis der Standardserviceendpunktschnittstelle und einer Providerschnittstelle. Wenn Sie einen JAX-WS-Web-Service aus vorhandenen Java-Klassen entwickeln (Bottom-up-Ansatz), müssen Sie die Klasse mit einer der Annotationen @WebService oder @WebServiceProvider versehen, damit die Klasse ursprünglich als Web-Service definiert wird.
Die Verwendung der Providerschnittstelle ist die dynamische Strategie für die Definition von JAX-WS-Services. Damit die Providerschnittstelle verwendet werden kann, muss Ihre Klasse die Schnittstelle "javax.xml.ws.Provider" implementieren und die Annotation @WebServiceProvider enthalten. Die Providerschnittstelle verfügt über die Methode "invoke", die generische Elemente in der Programmiersprache Java verwendet, um bei der Arbeit mit verschiedenen Nachrichten und Nachrichtennutzlasten die Eingabe- und Ausgabetypen zu steuern.
Mit Java-Annotationen dagegen können Sie Ihre Web-Services beschreiben, indem Sie die Strategie der Serviceendpunktschnittstelle (SEI) verwenden.
Informationen zu diesem Vorgang
Für die ursprüngliche Definition eines Web-Service müssen Sie die Java-Klasse mit der Annotationen @WebService versehen. Sie können aber auch selektiv einzelne Methoden mit der Annotation "@WebMethod" annotieren, um deren Bereitstellung als Web-Service-Operationen zu steuern.
Aufgrund der Mehrdeutigkeiten in den verschiedenen Web-Service-Spezifikationen bezüglich der Art und Weise, wie Methoden als Operationen bereitgestellt werden, sollten Sie die folgenden Richtlinien befolgen, um unabhängig von der JAX-WS-Implementierung, die Sie verwenden, ein konsistentes Verhalten sicherzustellen.
- Um einen Basis-Web-Service zu definieren, versehen Sie die Java-Klasse mit der Annotation "@WebService".
- Wenn Sie Ihre Web-Services für die Verwendung einer expliziten Serviceimplementierungsschnittstelle definieren, referenzieren Sie mit dem Attribut "endpointInterface" der Annotation "@WebService" eine Java-Schnittstellenklasse.
- Geben Sie eine Referenz auf eine WSDL-Datei im Attribut "wsdlLocation" der Annotation "@WebService" an. Durch Angabe einer vordefinierten WSDL-Datei wird die Leistung verbessert.
Außerdem werden Abweichungen zwischen der WSDL-Datei und den Annotationen
von der Laufzeitumgebung gemeldet.
Fehler vermeiden: Gemäß der Spezifikation JAX-WS 2.2 kann der Container die WSDL nicht automatisch generieren, wenn SOAP 1.2 als Bindungstyp und das Attribut wsdlLocation als leere Zeichenfolge deklariert ist (was standardmäßig der Fall ist). Wenn Sie ?wsdl zum Anfordern der WSDL-Datei verwenden, wird daher die folgende Ausnahmenachricht angezeigt:
Wenn Sie die WSDL-Datei anzeigen möchten, müssen Sie sie manuell generieren, in die Anwendung versetzen und das Attribut "wsdlLocation" mit der richtigen Position angeben. gotchaCWWKW0037E: Die mit der Spezifikation JAX-WS 2.2 kompatible WSDL kann nicht generiert werden.
- Wenn Sie eine explizite SEI verwenden, werden alle öffentlichen Methoden in der SEI und vererbte Klassen immer bereitgestellt. Sie müssen lediglich @WebMethod-Annotationen hinzufügen, wenn Sie die Methoden, die bereits bereitgestellt werden, weiter anpassen möchten.
- Durch die Angabe einer Referenz auf eine explizite Serviceimplementierungsschnittstelle oder eine vorhandene WSDL-Datei in der Annotation "@WebService" können mögliche Mehrdeutigkeiten bei der Bereitstellung von Methoden ausgeschaltet werden.
- Wenn Sie keine implizite Serviceimplementierungsschnittstelle verwenden, befolgen Sie diese Regeln, um sicherzustellen,
dass Ihre Methoden durchgängig bereitgestellt werden:
- Fügen Sie eine Annotation des Typs "@WebService" zu Ihrer Implementierungsklasse und zu allen zugehörigen Superklassen hinzu, die Methoden enthalten, die Sie bereitgestellt werden sollen. Durch Hinzufügen einer @WebService-Annotation zu einer Klasse werden alle öffentlichen Methoden in der betreffenden Klasse bereitgestellt, die nicht "static" oder "final" sind.
- Wenn Sie eine differenzierte Steuerung verwenden möchten, um nur bestimmte Methoden bereitzustellen, verwenden Sie die Annotation "@WebMethod" in ausgewählten Methoden. Um sicherzustellen, dass eine Methode bereitgestellt wird, versehen Sie sie mit der Annotation "@WebMethod". Wenn Sie gewährleisten möchten, dass eine Methode nicht bereitgestellt wird, versehen Sie sie mit der Annotation "@WebMethod(exclude=true)".

- Verhaltensänderung für die Bereitstellung nicht annotierter Methoden
Das Verhalten von JAX-WS hat sich in Bezug auf die Bereitstellung von Methoden als Web-Service-Operationen geändert. Dies entspricht den neuesten Erläuterungen zu JAX-WS-Spezifikationen.
Anwendungen ohne eine explizite Serviceimplementierungsschnittstelle oder WSDL, die von früheren Versionen migriert werden, können, wie im Folgenden gezeigt, weitere Operationen bereitstellen. Sie können eine Eigenschaft definieren, damit die JAX-WS-Laufzeitumgebung das traditionelle Verhalten verwendet. Diese Option wird möglicherweise benötigt, wenn Anwendungen ohne WSDL oder Serviceimplementierungsschnittstelle migriert werden, sodass keine weiteren Methoden bereitgestellt werden.
@WebService public class Foo { @WebMethod public void a() {} // jetzt bereitgestellt, zuvor bereitgestellt public void b() {} // jetzt bereitgestellt, zuvor nicht bereitgestellt }
Bei Verwendung der neuen Interpretation werden öffentliche Methoden in einer Implementierungsklasse und deren Superklassen nur unter folgenden Bedingungen bereitgestellt:- Die übergeordnete Klasse hat eine Annotation "@WebService".
- Die Methode hat keine Annotation @WebMethod(exclude=true).
Bei Verwendung der traditionellen Interpretation wird eine Methode in einer Implementierungsklasse und deren Superklassen nur unter folgenden Bedingungen bereitgestellt:- Die übergeordnete Klasse hat eine Annotation "@WebService".
- Die Methode hat keine Annotationen "@WebMethod", UND auch keine anderen Methoden haben Annotationen "@WebMethod".
- Die Methode hat eine Annotation des Typs @WebMethod oder @WebMethod(exclude=false).
Wenn die JAX-WS-Laufzeitumgebung das traditionelle @WebMethod-Verhalten verwenden soll, konfigurieren Sie die Eigenschaft jaxws.runtime.legacyWebMethod=true. Sie können diese Eigenschaft als JVM-Systemeigenschaft oder als Eigenschaft in der Datei META-INF/MANIFEST.MF einer WAR-Datei konfigurieren. Standardmäßig wird diese Eigenschaft auf false gesetzt, und der Anwendungsserver verwendet das neue Verhalten.
Möglicherweise wird die Fehlernachricht WSWS7054E ausgegeben, wenn alle folgenden Angaben zutreffend sind:- Ihre Web-Service-Anwendung besteht aus nicht annotierten Methoden.
- Die Methoden sind nicht für die Zuordnung zu einer Web-Service-Operation vorgesehen.
- Ihre Anwendung referenziert keine SEI und packt keine WSDL-Datei.
Die JAX-WS-Tools halten die JAX-WS-Spezifikation hinsichtlich der @WebMethod-Zuordnungsprinzipien ein. Diese Änderung kann Anwendungen betreffen, die von zuvor nicht kompatiblem Standardverhalten abhängig waren. Wenn Ihre Anwendungen WSDL oder eine SEI packen oder referenzieren und alle Methoden mit dem Exclude-Flag @WebMethod in der SEI-Implementierung annotiert sind, sind Sie von dieser Änderung nicht betroffen. Sie müssen jedoch, wenn Sie betroffen sind, explizite Annotationen zu Ihren Methoden hinzufügen, um sicherzustellen, dass sie bei der WSDL-Generierung ausgeschlossen werden. Beispiel: @WebMethod(exclude=true). Sie können auch eine WSDL mit Ihrer Anwendung packen, um zu verhindern, dass die Laufzeitkomponente eine WSDL für Sie generieren muss.javax.xml.ws.WebServiceException: WSWS7054E: Die WSDL-Datei für die Web-Service-Implementierungsklasse XXXX Web konnte aufgrund des folgenden Fehlers nicht generiert werden: javax.xml.ws.WebServiceException: Unable to create JAXBContext
- Verhaltensänderung für die Bereitstellung von Methoden des Typs "static" und "final":
Methoden des Typs "static" und "final" in einem Service ohne explizite Serviceimplementierungsschnittstelle werden nicht mehr als Web-Service-Operationen bereitgestellt. Wenn diese Methoden bereitgestellt werden sollen, packen Sie die WSDL mit der Anwendung, und definieren Sie jaxws.runtime.legacyWebMethod=true.
Vorgehensweise
- Identifizieren Sie die Methoden, die Sie als Web-Service-Operationen bereitstellen möchten.
- Sehen Sie sich die Regeln an, die verwendet werden, um Methoden als Operationen in Klassen bereitzustellen, die mit der Annotation @WebService versehen wurden.
- Verwenden Sie die bewährten Verfahren für das Anwenden der Annotationen "@WebMethod" und "@WebService" in Anwendungen ohne Serviceimplementierungsschnittstelen, damit Methoden ordnungsgemäß als Operationen in Ihren Web-Services bereitgestellt werden.
Ergebnisse
Sie haben die Annotation "@WebMethod" verwendet, um die Methoden anzugeben, die als Web-Service-Operationen bereitgestellt werden sollen.

Wenn Sie Ihre Anwendungsserverumgebung aktualisiert haben und Probleme auftreten, lesen Sie die folgenden Informationen zur Fehlerbehebung.
- Clientfehler weisen auf eine Abweichung zwischen der WSDL-Datei und dem Porttyp ("portType") hin, wenn eine Umgebung mit JAX-WS-Tools der Version 2.1.6 oder höher verwendet wird
- Möglicherweise erhalten Sie auf der Clientseite eine Fehlernachricht wie die folgende:
javax.xml.ws.WebServiceException: The Endpoint validation failed to validate due to the following errors: :: Invalid Endpoint Interface :: :: The number of operations in the WSDL portType does not match the number of methods in the SEI or web service implementation class. wsdl operations = [...] dispatch operations = [....]
Um diesen Fehler zu beheben, müssen Sie Clientartefakte neu generieren, sodass diese mit der WSDL-Datei übereinstimmen.
Bewährtes Verfahren: Jedes Mal, wenn Sie eine aktualisierte WSDL-Datei erhalten, müssen Sie auf der Clientseite die Artefakte neu generieren.bprac
- Clients, die eine ?WSDL-Operation auf Web-Services ausführen, haben Operationen, die nicht zugeteilt werden können
- Nachdem Sie eine ?WSDL-Operation ausgeführt haben, wird möglicherweise eine WSDL-Datei zurückgegeben, die mehr Operationen enthält als die JAX-WS-Laufzeitumgebung zuteilen kann. Wenn der Client versucht, Operationen aufzurufen, die nicht zugeteilt werden können, erhält er einen Fehler ähnlich dem in der folgenden Nachricht:
Die Endpunktreferenz (EPR) für die nicht gefundene Operation ist http://localhost:9086/example/BeanImpl2Service, und die WSA-Aktion ist <WSA-Aktno_vom_Server>. Wenn diese EPR zuvor erreichbar war, wenden Sie sich an den Serveradministrator.
Clients dürfen nur auf die Operationen zugreifen, die der Web-Service bereitstellen wird. Sie können dieses Problem beheben, indem Sie einen der folgenden Schritte ausführen:- Ändern Sie die @WebMethod-Annotationen in der Web-Service-Anwendung in der Weise, dass die resultierende WSDL-Datei die richtige Menge Operationen bereitstellt.
- Setzen Sie die Eigenschaft jaxws.runtime.legacyWebMethod auf false, um sicherzustellen, dass alle Operationen in der WSDL zugeteilt werden.
Nächste Schritte
Entwickeln Sie Java-Artefakte für JAX-WS-Anwendungen aus JavaBeans.