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.
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).
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.
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.
<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.
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.
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]](../images/windows.gif)
![[z/OS]](../images/ngzos.gif)
PROXY_INFO="-Dproxy.httpHost=Ihr_Proxy-Host -Dproxy.httpPort=Ihr_Proxy-Port
![[Linux]](../images/linux.gif)
![[AIX]](../images/aixlogo.gif)
![[HP-UX]](../images/hpux.gif)
![[Solaris]](../images/solaris.gif)
![[z/OS]](../images/ngzos.gif)
PROXY_INFO="-Dproxy.httpHost=Ihr_Proxy-Host -Dproxy.httpPort=Ihr_Proxy-Port
![[IBM i]](../images/iseries.gif)
- Editieren Sie die Datei Profilstammverzeichnis/bin/WSDL2Java, und fügen Sie am Anfang der Datei die folgende
Zeile hinzu:
Wenn Sie diese Option verwenden, muss der Befehl WSDL2Java im Verzeichnis Profilstammverzeichnis/bin aufgerufen werden.export PROXY_INFO="-Dproxy.httpHost=yourProxyHost -Dproxy.httpPort=yourProxyPort"
- Setzen Sie die Umgebungsvariable PROXY_INFO in der Qshell-Sitzung wie folgt, bevor Sie den
Befehl WSDL2Java aufrufen:
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.$ export PROXY_INFO ="-Dproxy.httpHost=yourProxyHost -Dproxy.httpPort=yourProxyPort"
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.
Sie können die Datei urlprotocols.jar wie folgt dem Klassenpfad hinzufügen:
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.
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.
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.