Web サービス・コマンド行ツールのトラブルシューティングのヒント

このヒントを利用して、Java™ API for XML-based RPC (JAX-RPC) の Web サービス開発の際に使用される WSDL2Java および Java2WSDL のコマンド行ツールのトラブルシューティングを行います。

このトピックの各セクションでは、WSDL2Java または Java2WSDL ツールの使用中に経験する可能性のある問題を取り上げます。 また、それらの問題のトラブルシューティングに役立つ解決策が 提示されています。

[z/OS]WSDL2Java および Java2WSDL コマンド行ツールは、z/OS® プラットフォームではサポートされません。 この機能は、z/OS プラットフォーム で稼働する WebSphere® Application Server で提供されるアセンブリー・ツールによって提供されます。 これらのツールについて詳しくは、Java API for XML-based Remote Procedure Call (JAX-RPC) アプリケーションの WSDL2Java および Java2WSDL コマンド行ツールに関する資料を参照してください。

.Net クライアントで、Vector タイプのパラメーターを指定した Web サービス・メソッドが反映されません。Web サービスで .NET クライアントを実行すると、次のような例外が表示されます。
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.   

この問題が発生するのは、サーバー・サイド・メソッドが Vector を戻し、 Web サービス記述言語 (WSDL) ファイルのスタイルが document/literal で、かつフォームが非修飾である場合です。 document/literal スタイルでは、必ず非修飾のフォームが 生成されます。これは、デフォルトで elementFormDefault="unqualified" になっているためです。

.NET フレームワークには、Web サービス・メソッドのパラメーターに 特定の配列が含まれていると、無効な Web サービス・プロキシー・クラスが生成される場合があるという問題が存在します。 このフレームワークはパラメーターに XmlArrayAttribute 属性を 追加し、属性コンストラクターには "Form=Unqualified" および名前空間定義が含まれています。 属性が有効であっても、その属性の これら 2 つのエレメントの組み合わせは無効であり、System.InvalidOperationException 例外が発生します。

この問題を回避するため、WebSphere Application Server にデプロイされる Web サービス・メソッドでは、 Vector パラメーターを使用しないでください。Web サービス・メソッドの Vector パラメーターは、 .Net クライアントや Java コレクション・タイプでは機能しません。

ハイパー・スレッディング対応マシンで Endpoint Enabler ツールを実行すると、 「タスク」ビューに、エンタープライズ・アプリケーション・プロジェクトに対するエラーが報告されます。 エンタープライズ・アプリケーション・プロジェクトは、ワークベンチを再始動するまで削除できません。

この問題は、自動ビルドと Enterprise JavaBeans (EJB) プロジェクト・バリデーターの間に 競合状態が存在する場合に発生することがあります。

この問題を解決するには、ワークベンチの自動ビルドをオフにしてから Endpoint Enabler ツールを 実行し、その後、自動ビルドをオンに戻します。

Java2WSDL コマンド行ツールによって生成された httpjms、および ejb バインディングを持つ WSDL ファイルを含んだ エンタープライズ・アーカイブ (EAR) ファイルをデプロイする際に、Java Specification Requests (JSR) 109 仕様の 検証エラーが発生します。

JSR 109 仕様では、 webservices.xml デプロイメント記述子ファイルで定義された各ポート・コンポーネントは、 JavaBeans 実装の場合、web.xml ファイルにある固有の <servlet-class> エレメントを参照し、 EJB 実装の場合、ejb-jar.xml ファイルにある固有の <session> エレメントを 参照する必要があります。サーブレットおよびセッション EJB は、 <servlet-link> または <ejb-link> エレメントによって表される webservices.xml ファイルにあります。

WSDL2Java コマンド行ツールは、 WSDL ファイルで検出されたポートを、生成された webservices.xml ファイル内の ポート・コンポーネントにマップします。 単一の Web サービスに、これらの各バインディングの ポートのほかに複数のバインディングが存在する場合、webservices.xml ファイルには、 複数のポート・コンポーネントが含まれ、これらのポート・コンポーネントはすべて、同じ EJB モジュール (<session>) または JavaBeans (<servlet-class>) 実装を指す必要があります。JSR 109 の制約事項のため、webservices.xml ファイルは無効であり、 デプロイメント・プロセス時にエラーが発生することがあります。

次のようなエラーが表示されます。
<module> でエラーが発生しました: CHKW6030E: 実装クラス <class> が port component <port1> および <port2> によって参照されました。(JSR109 1.0: 7.1.2).	
以下は、サンプル・データを含んだエラーです。
Error in WebSvcsInSession20EJB.jar : CHKW6030E: Implementation class WSMultiProtocol 
referred to by port components WSMultiProtocolJMS and WSMultiProtocolEJB.(JSR109 1.0: 7.1.2).	

ejb-jar.xml ファイル内に、同じ実装クラス、 ホーム・インターフェース、およびリモート・インターフェースをすべてポイント する複数の <session> EJB 定義を作成することによって、この制約事項を 回避することができます。 これらのクラスは今後も使用することができますが、 クラスおよびインターフェースを参照する ejb-jar.xml ファイルの <session> 定義を複製する必要があります。

以下は、webservices.xml ファイルの例です。 クラスおよびインターフェースを確認してください。
<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>
以下は、ejb-jar.xml ファイルの例です。 クラスおよびインターフェースと探して、 それらがどのように複製されているかを確認してください。
<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>

あるアプリケーションが特定の修正が提供する機能を使用している場合にその修正を除去すると、 そのアプリケーションからエラー・メッセージが表示されます。 修正を除去する場合は、アプリケーションの再テストを行って、 エラーの有無を確認してください。 修正を除去したためにエラー・メッセージを表示するアプリケーションがあれば、 すべて再デプロイします。

例えば、WebSphere Application Server に フィックスパックをインストールし、株価情報の Web サービス StockQuote を作成するとします。WSDL2Java コマンド行ツールをデプロイヤー・ロールで使用して、 AgnosticService クラスを拡張する ServiceLocator クラスを生成します。

ここでフィックスパックをアンインストールすると、アプリケーションは、 WebSphere Application Server のそのバージョンではサポートされていない新しい Web サービス・クラス (AgnosticService) を使用することになります。アプリケーションは以下のエラーを作成します。
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 																														
使用する Web サービス・クラスでサポートされていないバージョンの WebSphere Application Server を使用しないコードを出力するには、WebSphere Application Server 上でアプリケーションを再デプロイする必要があります。

プロキシー・サーバーが必要な環境で WSDL2Java コマンドの実行中にインターネットにアクセスすると、 WSDL2Java コマンドがインターネット情報を見つけられないことがあります。これは、 プロキシー・サーバーがタイムアウトになる可能性があるためです。 例えば、入力 WSDL ファイルがローカル・ドライブではなくインターネット上にあり、 そのファイルをインターネットから取得する必要がある場合、 プロキシー・サーバーがタイムアウトになるために、WSDL2Java コマンドはファイルの検出に失敗します。

[AIX Solaris HP-UX Linux Windows][z/OS]この問題を回避するには、 Windows オペレーティング・システムでは WSDL2Java.bat ファイルを、 Linux または AIX® オペレーティング・システムでは WSDL2Java.sh ファイルを編集します。これらのファイルは、<install_root>/WebSphere/AppServer/bin ディレクトリーにあります。

[Windows][z/OS]Windows オペレーティング・システムを使用する場合は、次のように、 WSDL2Java.bat ファイルでプロキシー・ホストとプロキシー・ポートの値を設定します。
PROXY_INFO="-Dproxy.httpHost=yourPproxyHost -Dproxy.httpPort=yourProxyPort
[Linux][AIX][HP-UX][Solaris][z/OS]Linux または AIX オペレーティング・システムを使用する場合は、次のように、 WSDL2Java.sh ファイルでプロキシー・ホストとプロキシー・ポートの値を設定します。
PROXY_INFO="-Dproxy.httpHost=yourProxyHost -Dproxy.httpPort=yourProxyPort
[IBM i]この問題は、 app_server_root/bin ディレクトリーにある WSDL2Java コマンドを編集することで回避できます。 次のいずれかの方法で、プロキシー・ホストとポート値を設定します。
  • profile_root/bin/WSDL2Java ファイルを編集して、ファイルの先頭に次の行を追加します。
    export PROXY_INFO="-Dproxy.httpHost=yourProxyHost -Dproxy.httpPort=yourProxyPort"
    このオプションを使用する場合は、profile_root/bin ディレクトリー内の WSDL2Java コマンドを呼び出す必要があります。
  • 次のように、WSDL2Java コマンドを呼び出す前に、Qshell セッション内の PROXY_INFO 環境変数を設定します。
    $ export PROXY_INFO ="-Dproxy.httpHost=yourProxyHost -Dproxy.httpPort=yourProxyPort" 
    このオプションを使用する場合は、新しい QSHELL セッションを開始するたびに、このコマンドを実行する必要があります。 毎回 QSHELL を開始したくない場合は、このコマンドをプロファイルに追加することができます。

[AIX Solaris HP-UX Linux Windows][z/OS]JMS スタイルのエンドポイント Web アドレス (例えば jms:/...) を含む WSDL 文書で WSDL2Java コマンド行ツールを実行する場合、JMS プロトコル用のカスタム・プロトコル・ハンドラーを含む urlprotocols.jar ファイルが CLASSPATH 変数ステートメント内になければなりません。urlprotocols.jar ファイルを確実に CLASSPATH 変数ステートメント内に置くことにより、 エラー「WSWS3099E: エラー: エミッター障害。ポート <x>、サービス <y> に無効なエンドポイント・アドレスがあります: <jms-url-string>」は回避されます。

[AIX Solaris HP-UX Linux Windows][z/OS]urlprotocols.jar ファイルを CLASSPATH 変数ステートメントに追加するには、 以下のようにします。

[Windows][z/OS]Windows プラットフォームでは、install_root¥bin¥setupCmdLine.bat ファイルを編集して、 WAS_CLASSPATH 環境変数を設定している行を見つけます。WAS_CLASSPATH 環境変数を設定している行の末尾に、 %install_root%¥lib¥urlprotocols.jar を追加します。

[Linux][AIX][z/OS][Solaris][HP-UX]Linux、AIX、HP-UX、Solaris の各オペレーティング・システムでは、install_root/bin/setupCmdLine.sh ファイルを編集して、WAS_CLASSPATH 環境変数を設定している行の末尾に $install_root/lib/urlprotocols.jar を追加します。

[AIX Solaris HP-UX Linux Windows][z/OS]ご使用のプラットフォームに応じた適切な区切り文字を使用するようにしてください。 例えば、Windows プラットフォームではセミコロン (;) を、Linux、AIX、HP-UX、Solaris の各オペレーティング・システムではコロン (:) を使用します。


トピックのタイプを示すアイコン 参照トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=rwbs_trbcommand
ファイル名:rwbs_trbcommand.html