Tipps zur Fehlerbehebung für die Befehlszeilentools von Web-Service-Clients

Verwenden Sie die folgenden Tipps für die Fehlerbehebung bei den Befehlszeilentools WSDL2Java und Java2WSDL, die bei der Entwicklung von JAX-RPC-Web-Services (Java™ API for XML-based RPC) verwendet werden.

Jeder Abschnitt dieses Artikels beschreibt ein Problem, das auftreten kann, wenn Sie mit den Tools WSDL2Java und Java2WSDL arbeiten. Zur Unterstützung der Fehlerbehebung werden Lösungsvorschläge angeboten.

[z/OS]Die Befehlszeilentools WSDL2Java und Java2WSDL werden auf der z/OS-Plattform nicht unterstützt. Diese Funktionalität wird von den Assembliertools, die in der z/OS-Version von WebSphere Application Server enthalten sind, bereitgestellt. Weitere Informationen zu diesen Tools finden Sie in den Beschreibungen der Befehlszeilentools WSDL2Java und Java2WSDL für JAX-RPC-Anwendungen (Java API for XML-based Remote Procedure Call).

Der .Net-Client gibt keine Web-Service-Methode mit vektorbasierten Parametern zurück. Die folgende Ausnahme wird angezeigt, wenn Sie den .NET-Client für einen Web-Service ausführen:
System.InvalidOperationException: Method AnnuityInteropService.wsListAnnuityByHolder cannot be reflected.
System.InvalidOperationException: There was an error reflecting wsListAnnuityByHolderResult.
System.InvalidOperationException: The Form property might not be unqualified when an explicit namespace
property is available.   

Das Problem tritt auf, wenn die serverseitige Methode einen Vektor zurückgibt, der Stil der WSDL-Datei (Web Services Description Language) document/literal und das Format nicht qualifiziert ist. Das nicht qualifizierte Format wird standardmäßig für den Stil document/literal generiert, weil elementFormDefault standardmäßig den Wert "unqualified" hat.

Es ist ein Problem im .NET-Framework bekannt, das bewirken kann, dass eine ungültige Proxy-Klasse für einen Web-Service generiert wird, wenn die Web-Service-Methoden bestimmte Arrays als Parameter enthalten. Das Framework fügt dem Parameter ein Attribut XmlArrayAttribute hinzu, und der Attributkonstruktor enthält "Form=Unqualified" und eine Namespacedefinition. Das Attribut ist zwar gültig, aber es ist nicht zulässig, diese beiden Aspekte des Attributs zu kombinieren. Dies führt zu der Ausnahme System.InvalidOperationException.

Sie können dieses Problem vermeiden, indem Sie keine vektorbasierten Parameter in einer Web-Service-Methode verwenden, die in WebSphere Application Server implementiert ist. Vektorparameter in einer Web-Service-Methode funktionieren nicht für .Net-Clients und Java-Datensammlungstypen.

Wenn Sie das Endpunkt-Enabler-Tool auf einer Maschine mit aktiviertem Hyper-Threading ausführen, wird ein Fehler in der Taskansicht für das Unternehmensanwendungsprojekt berichtet. Das Unternehmensanwendungsprojekt kann erst gelöscht werden, wenn Sie die Workbench erneut starten.

Dieses Problem kann auftreten, wenn eine Konkurrenzsituation zwischen automatischem Build und EJB-Projektvalidator (Enterprise JavaBeans) besteht.

Sie können dieses Problem beheben, indem Sie den automatischen Build in der Workbench inaktivieren, bevor Sie das Endpunkt-Enabler-Tool ausführen, und später wieder aktivieren.

Laut Java Specification Requests (JSR) 109 treten Validierungsfehler auf, wenn eine EAR-Datei implementiert wird, die eine WSDL-Datei mit http-, jms- und ejb-Bindungen enthält, die vom Befehlszeilentool Java2WSDL generiert werden.

Die Spezifikation JSR 109 erfordert, dass jede Portkomponente, die im Implementierungsdeskriptor webservices.xml definiert ist, auf eindeutige <servlet-class>-Elemente in der Datei web.xml für eine JavaBeans-Implementierung oder ein eindeutiges <session>-Element in der ejb-jar.xml-Datei für eine EJB-Implementierung verweist. Das Servlet und die Sitzungs-EJB befinden sich in der Datei webservices.xml und werden durch das Element <servlet-link> oder <ejb-link> angegeben.

Das Befehlszeilentool WSDL2Java ordnet die in einer WSDL-Datei gefundenen Ports Portkomponenten zu, die in der generierten Datei webservices.xml enthalten sind. Wenn ein einzelner Web-Service mehrere Bindungen hat, enthält die Datei webservices.xml zusätzlich zu einem Port für jede dieser Bindungen mehrere Portkomponenten, die alle auf dieselbe EJB-Modul-Implementierung (<session>) oder JavaBeans-Implementierung (<servlet-class>) müssen. Aufgrund der Einschränkungen von JSR 109 ist die Datei webservices.xml nicht gültig, und es können Fehler während der Implementierung auftreten.

Das folgende Beispiel zeigt den Fehler:
Fehler in <Modul> : CHKW6030E: Die Implementierungsklasse <Klasse>, auf die die Portkomponenten
<Port 1> und <Port 2> verweisen. (JSR109 1.0: 7.1.2).	
Nachfolgend sehen Sie den Fehler mit Beispieldaten:
Fehler in WebSvcsInSession20EJB.jar : CHKW6030E: Die Implementierungsklasse WSMultiProtocol,
auf die die Portkomponenten WSMultiProtocolJMS und WSMultiProtocolEJB verweisen. (JSR109  1.0: 7.1.2).	

Sie können eine Ausweichlösung für diese Einschränkung verwenden, indem Sie mehrere <session>-EJB-Definitionen in der Datei ejb-jar.xml erstellen, die alle auf dieselbe Implementierungsklasse, Home-Schnittstelle und Remote-Schnittstelle verweisen. Sie können immer noch dieselben Klassen verwenden, aber die <session>-Definitionen der Datei ejb-jar.xml, die auf die Klassen verweisen, müssen dupliziert werden.

Im Folgenden sehen Sie ein Beispiel für die Datei webservices.xml. Suchen Sie nach den Klassen und Schnittstellen:
<webservices>
  <webservice-description>
    <webservice-description-name>WSMultiProtocolService</webservice-description-name>
    <wsdl-file>META-INF/wsdl/WSMultiProtocol.wsdl</wsdl-file>
    <jaxrpc-mapping file>META-INF/WSMultiProtocol_mapping.xml</jaxrpc-mapping file>
    <port-component>
      <port-component-name>WSMultiProtocolEjb</port-component-name>
      <wsdl-port>
        <namespaceURI>http://ejb.pli.tc.wssvt.ibm.com</namespaceURI>
        <localpart>WSMultiProtocolEjb</localpart>
      </wsdl-port>
      <service-endpoint-interface>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocol
						</service-endpoint-interface>
      <service-impl-bean>
        <ejb-link>WSMultiProtocol</ejb-link>
      </service-impl-bean>
    </port-component>
    <port-component>
				<port-component-name>WSMultiProtocolJMS</port-component-name>
      <wsdl-port>
        <namespaceURI>http://ejb.pli.tc.wssvt.ibm.com</namespaceURI>
        <localpart>WSMultiProtocolJMS</localpart>
      </wsdlport>
      <service-endpoint-interface>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocol
						</service-endpoint-interface>
      <service-impl-bean>
        <ejb-link>WSMultiProtocol_2</ejb-link>
      </service-impl_bean>
		</port-component>
        <port-component>
       				<port-component-name>WSMultiProtocolJMS</port-component-name>
      <wsdl-port>
        <namespaceURI>http://ejb.pli.tc.wssvt.ibm.com</namespaceURI>
        <localpart>WSMultiProtocolJMS</localpart>
      </wsdlport>
      <service-endpoint-interface>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocol
						</service-endpoint-interface>
      <service-impl-bean>
        <ejb-link>WSMultiProtocol_3</ejb-link>
      </service-impl_bean>
		</port-component>
		</webservice-description>
</webservices>
Im Folgenden sehen Sie ein Beispiel für die Datei ejb-jar.xml. Suchen Sie die Klassen und Schnittstellen und sehen Sie sich an, wie diese dupliziert werden:
<ejb-jar-id="ejb-jar_ID">
		<display-name>WebSvcsInsSession20EJB</display-name>
		<enterprise-beans>
				<session-id="WSMultiProtocol">
						<ejb-name>WSMultiProtocol</ejb-name>
						<home>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocolHome</home>
						<remote>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocol</remote>
						<ejb-class>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocolWebSvcsBean</ejb-class>
						<session-type>Stateless</session-type>
						<transaction-type>Container</transaction-type>
						<ejb-ref-id="EjbRef_1082407586720">
				<description></description>
								<ejb-ref-name>ejb/BeneficiarySession</ejb-ref-name>
								<ejb-ref-type>Session</ejb-ref-type>
								<home>com.ibm.wssvt.tc.pli.ejb.BeneficiarySessionHome</home>
								<remote>com.ibm.wssvt.tc.pli.ejb.BeneficiarySession</remote>
								<ejb-link>PolicySession20EJB.jar#BeneficiarySession</ejb-link>
						</ejb-ref>
						<ejb-ref-id="EjbRef_1082407586790">
				<description></description>
								<ejb-ref-name>ejb/PolicySession</ejb-ref-name>
								<ejb-ref-type>Session</ejb-ref-type>
								<home>com.ibm.wssvt.tc.pli.ejb.PolicySessionHome</home>
								<remote>com.ibm.wssvt.tc.pli.ejb.PolicySession</remote>
								<ejb-link>PolicySession20EJB.jar#PolicySession</ejb-link>
						</ejb-ref>
		
		
				<session-id="WSMultiProtocol_2">
						<ejb-name>WSMultiProtocol_2</ejb-name>
						<home>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocolHome</home>
						<remote>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocol</remote>
						<ejb-class>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocolWebSvcsBean</ejb-class>
						<session-type>Stateless</session-type>
						<transaction-type>Container</transaction-type>
						<ejb-ref-id="EjbRef_1082407586720_2">
				<description></description>
								<ejb-ref-name>ejb/BeneficiarySession</ejb-ref-name>
								<ejb-ref-type>Session</ejb-ref-type>
								<home>com.ibm.wssvt.tc.pli.ejb.BeneficiarySessionHome</home>
								<remote>com.ibm.wssvt.tc.pli.ejb.BeneficiarySession</remote>
								<ejb-link>PolicySession20EJB.jar#BeneficiarySession</ejb-link>
						</ejb-ref>
						<ejb-ref-id="EjbRef_1082407586790_2">
				<description></description>
								<ejb-ref-name>ejb/PolicySession</ejb-ref-name>
								<ejb-ref-type>Session</ejb-ref-type>
								<home>com.ibm.wssvt.tc.pli.ejb.PolicySessionHome</home>
								<remote>com.ibm.wssvt.tc.pli.ejb.PolicySession</remote>
								<ejb-link>PolicySession20EJB.jar#PolicySession</ejb-link>
						</ejb-ref>
		
		
				<session-id="WSMultiProtocol_3">
						<ejb-name>WSMultiProtocol_3</ejb-name>
						<home>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocolHome</home>
						<remote>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocol</remote>
						<ejb-class>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocolWebSvcsBean</ejb-class>
						<session-type>Stateless</session-type>
						<transaction-type>Container</transaction-type>
						<ejb-ref-id="EjbRef_1082407586790_3">
				<description></description>
								<ejb-ref-name>ejb/BeneficiarySession</ejb-ref-name>
								<ejb-ref-type>Session</ejb-ref-type>
								<home>com.ibm.wssvt.tc.pli.ejb.BeneficiarySessionHome</home>
								<remote>com.ibm.wssvt.tc.pli.ejb.BeneficiarySession</remote>
								<ejb-link>PolicySession20EJB.jar#BeneficiarySession</ejb-link>
						</ejb-ref>
						<ejb-ref-id="EjbRef_1082407586790_3">
				<description></description>
								<ejb-ref-name>ejb/PolicySession</ejb-ref-name>
								<ejb-ref-type>Session</ejb-ref-type>
								<home>com.ibm.wssvt.tc.pli.ejb.PolicySessionHome</home>
								<remote>com.ibm.wssvt.tc.pli.ejb.PolicySession</remote>
								<ejb-link>PolicySession20EJB.jar#PolicySession</ejb-link>
						</ejb-ref>
				</session>

Wenn eine Anwendung Funktionen verwendet, die in einem bestimmten Fix enthalten sind, und Sie diesen Fix entfernen, gibt die Anwendung eine Fehlernachricht aus. Wenn Sie einen Fix entfernen, müssen Sie Ihre Anwendungen erneut testen, um mögliche Fehler zu erkennen. Implementieren Sie alle Anwendungen erneut, die Fehlernachrichten bezüglich des fehlenden Fix anzeigen.

Angenommen, Sie installieren einen Fixpack in WebSphere Application Server und erstellen den Web-Service StockQuote. Das Befehlszeilentool WSDL2Java wird in einer Deployer-Rolle verwendet und generiert eine Klasse ServiceLocator, die die Klasse AgnosticService erweitert.

Wenn Sie das Fixpack deinstallieren, verwendet die Anwendung eine neue Web-Service-Klasse (AgnosticService), die von der verwendeten Version von WebSphere Application Server nicht unterstützt wird. Die Anwendung löst den folgenden Fehler aus:
java.lang.NoClassDefFoundError:
		Error while defining class:
	com.ibm.ws.wsfvt.test.stockquote.StockQuoteServiceLocator
		This error indicates that the class:
	com.ibm.webservices.multiprotocol.AgnosticService
		could not be located  while defining the class:
	com.ibm.ws.wsfvt.test.stockquote.StockQuoteServiceLocator 																														
Sie müssen die Anwendung erneut in WebSphere Application Server implementieren, um Code bereitzustellen, der nicht die Version von WebSphere Application Server verwendet, die von der verwendeten Web-Service-Klasse nicht unterstützt wird.

Wenn Sie eine Umgebung verwenden, in der während der Ausführung des Befehls WSDL2Java ein Proxy-Server für den Zugriff auf das Internet erforderlich ist, findet der Befehl WSDL2Java möglicherweise die Internet-Informationen nicht, weil der Proxy-Server unter Umständen das zulässige Zeitlimit überschreitet. Wenn sich die WSDL-Eingabedatei beispielsweise im Internet und nicht auf einem lokalen Laufwerk befindet, schlägt der Befehl WSDL2Java beim Suchen der Datei im Internet fehl, weil der Proxy-Server das zulässige Zeitlimit überschreitet.

[AIX Solaris HP-UX Linux Windows][z/OS]Sie können dieses Problem umgehen, in dem Sie die Datei WSDL2Java.bat (Windows -Betriebssystem) bzw. die Datei WSDL2Java.sh (Linux- oder AIX-Betriebssystem) editieren. Diese Dateien sind im Verzeichnis <Installationsstammverzeichnis>/WebSphere/AppServer/bin enthalten.

[Windows][z/OS]Wenn Sie ein Windows-Betriebssystem verwenden, setzen Sie Host- und Portwerte für den Proxy-Server in der Datei WSDL2Java.bat wie folgt:
PROXY_INFO="-Dproxy.httpHost=Ihr_Proxy-Host -Dproxy.httpPort=Ihr_Proxy-Port
[Linux][AIX][HP-UX][Solaris][z/OS]Wenn Sie ein Linux- oder AIX-Betriebssystem verwenden, setzen Sie Host- und Portwerte für den Proxy-Server in der Datei WSDL2Java.sh wie folgt:
PROXY_INFO="-Dproxy.httpHost=Ihr_Proxy-Host -Dproxy.httpPort=Ihr_Proxy-Port
[IBM i]Sie können dieses Problem umgehen, indem Sie den Befehl WSDL2Java im Verzeichnis Stammverzeichnis_des_Anwendungsservers/bin ändern. Setzen Sie Host- und Portwert für den Proxy-Server auf eine der folgenden Arten:
  • Editieren Sie die Datei Profilstammverzeichnis/bin/WSDL2Java, und fügen Sie am Anfang der Datei die folgende Zeile hinzu:
    export PROXY_INFO="-Dproxy.httpHost=yourProxyHost -Dproxy.httpPort=yourProxyPort"
    Wenn Sie diese Option verwenden, muss der Befehl WSDL2Java im Verzeichnis Profilstammverzeichnis/bin aufgerufen werden.
  • Setzen Sie die Umgebungsvariable PROXY_INFO in der Qshell-Sitzung wie folgt, bevor Sie den Befehl WSDL2Java aufrufen:
    $ export PROXY_INFO ="-Dproxy.httpHost=yourProxyHost -Dproxy.httpPort=yourProxyPort" 
    Wenn Sie diese Option verwenden, müssen Sie den Befehl jedes Mal ausführen, wenn eine neue QSHELL-Sitzung gestartet wird. Wenn Sie die QSHELL nicht jedes Mal starten möchten, können Sie dem Profil den Befehl hinzufügen.

[AIX Solaris HP-UX Linux Windows][z/OS]Wenn Sie das Befehlszeilentool WSDL2Java mit einem WSDL-Dokument aufrufen, das eine Endpunktwebadresse im JMS-Stil enthält, z. B. jms:/..., muss die Datei urlprotocols.jar, die den angepassten Protokollhandler für das JMS-Protokoll enthält, in der Variablenanweisung CLASSPATH enthalten sein. Der Fehler WSWS3099E: Fehler: Emitter-Fehler. Ungültige Endpunktadresse an Port <x> in Service <y>: <JMS-URL-Zeichenfolge> kann vermieden werden, wenn sichergestellt wird, dass die Datei urlprotocols.jar in der Anweisung der Klassenpfadvariable enthalten ist.

[AIX Solaris HP-UX Linux Windows][z/OS]Sie können die Datei urlprotocols.jar wie folgt dem Klassenpfad hinzufügen:

[Windows][z/OS]Bearbeiten Sie auf Windows-Plattformen die Datei install_root\bin\setupCmdLine.bat. Suchen Sie die Zeile, in der die Umgebungsvariable WAS_CLASSPATH gesetzt wird. Fügen Sie am Ende der Zeile, die die Umgebungsvariable WAS_CLASSPATH definiert, %install_root%\lib\urlprotocols.jar hinzu.

[Linux][AIX][z/OS][Solaris][HP-UX]Unter den Betriebssystemen Linux, AIX, HP-UX und Solaris bearbeiten Sie die Datei Installationsstammverzeichnis/bin/setupCmdLine.sh, und fügen $install_root/lib/urlprotocols.jar am Ende der Zeile hinzu, die die Umgebungsvariable WAS_CLASSPATH definiert.

[AIX Solaris HP-UX Linux Windows][z/OS]Verwenden Sie das richtige Trennzeichen für Ihre Plattform, z. B. ein Semikolon (;) für Windows-Plattformen und einen Doppelpunkt (:) für die Betriebssysteme Linux, AIX, HP-UX und Solaris.


Symbol, das den Typ des Artikels anzeigt. Referenzartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=rwbs_trbcommand
Dateiname:rwbs_trbcommand.html