WebSphere Application Server Network Deployment for i5/OS, Version 6.1   
             オペレーティング・システム: i5/OS

             目次と検索結果のパーソナライズ化

Web サービスのシリアライゼーションおよびデシリアライゼーションのトラブルシューティングのヒント

このトピックでは、Web サービスでシリアライゼーションおよびデシリアライゼーションを実行する際に生じる可能性のある問題について論じます。

このトピックの各セクションでは、 Web サービスをシリアライズおよびデシリアライズする際に経験する可能性のある問題を取り上げます。 また、それらの問題のトラブルシューティングに役立つ解決策が 提示されています。

デシリアライズされた java.util.Calendar の時間帯情報が期待される情報と異なる

クライアントおよびサーバーが Java コードに基づいており、java.util.Calendar インスタンスが受信される場合、 受信した java.util.Calendar インスタンスの時間帯は、送信された java.util.Calendar インスタンスの時間帯と異なる場合があります。

このようは違いが生じるのは、 java.util.Calendar が伝送用に xsd:dateTime としてエンコードされるためです。xsd:dateTime は、 正しい時刻 (基本時刻プラス (またはマイナス) 時間帯オフセット) をエンコードするために必要ですが、 元の時間帯を含むロケール情報の保存には必要ありません。

Calendar インスタンスの比較をする場合、 現在のロケールの時間帯が保存されないという事実を考慮する必要があります。java.util.Calendar class equals メソッドは、時刻が同じであることを判別する場合に時間帯が同じであることをチェックします。 デシリアライズされた Calendar インスタンスの時間帯は現在のロケールと一致しないことがあるため、 以下の例に示すように、before comparison メソッドと after comparison メソッドを使用して、 2 つの Calendar が同じ日付と時刻を参照することをテストする必要があります。
java.util.Calendar c1 = ...// Date and time in time zone 1
java.util.Calendar c2 = ...// Same date and equivalent time, but in time zone 2

// c1 and c2 are not equal because their time zones are different
if (c1.equals (c2)) System.out.println("c1 and c2 are equal");

// but c1 and c2 do compare as "not before and not after" since they represent 
the same date and time
if (!c1.after(c2) & !c1.before(c2) {
			System.out.println("c1 and c2 are equivalent");
}

Web サービスのクライアント・バインディングとサーバー・バインディングの混合はエラーの原因になる

Java 2 Platform, Enterprise Edition (J2EE) 仕様 および Java API for XML-based remote procedure call (JAX-RPC) 仕様向けの Web サービスでは、 Java コードと、すべての Java タイプに対する Web サービス記述言語 (WSDL) 文書の間の 往復 マッピングはサポートされていません。 例えば、 Java Date を XML コードに変換 (つまりシリアライズ) して、その後 Java DATE に戻す (つまりデシリアライズする) ことはできません。 このアクションは、Java Calendar としてデシリアライズされます。

WSDL 文書を作成する Java インプリメンテーションがあり、WSDL 文書からクライアント・バインディングを生成する場合、 クライアント・クラスが同じパッケージ名およびクラス名を持つ場合であっても クライアント・クラスをサーバー・クラスとは別にできます。Web サービス・クライアント・クラスは、Web サービス・サーバー・クラスとは 分離されている必要があります。例えば、Java アーカイブ (JAR) ファイルに Web サービス・サーバー・バインディング・クラスを配置して、 同じユーティリティー JAR ファイルを参照する Web サービス・クライアント JAR ファイルを 組み込まないでください。

Web サービス・クライアントとサーバー・クラスが分離されていない場合、 使用する Java クラスに応じて、さまざまな例外が発生する可能性があります。以下は、発生する可能性があるサンプルのスタック・トレース・エラーです。
com.ibm.ws.webservices.engine.PivotHandlerWrapper TRAS0014I: The following exception was loggedjava.lang.NoSuchMethodError: com.ibm.wssvt.acme.websvcs.ExtWSPolicyData: method getStartDate()Ljava/util/Date; not found 
at com.ibm.wssvt.acme.websvcs.ExtWSPolicyData_Ser.addElements(ExtWSPolicyData_Ser.java: 210)
at com.ibm.wssvt.acme.websvcs.ExtWSPolicyData_Ser.serialize (ExtWSPolicyData_Swer.java:29)
at com.ibm.ws.webservices.engine.encoding.SerializationContextImpl.serializeActual (SerializationContextImpl.java 719)
at com.ibm.ws.webservices.engine.encoding.SerializationContextImpl.serialize (SerializationContextImpl.java: 463)
問題が発生するのは、サービス・インプリメンテーションで、 サービス・エンドポイント・インターフェースに以下の例に示すようなインターフェースを使用するためです。
package server:
public interface Test_SEI extends java.rmi.Remote {
	public java.util.Calendar getCalendar () throws java.rmi.RemoteException;
	public java.util.Date getDate() throws java.rmi.RemoteException;
}
このインターフェースが Java2WSDL コマンド行ツールを介してコンパイルおよび実行される場合、 WSDL 文書はメソッドを以下の例に示すようにマップします。
<wsdl:message name="getDateResponse">
	<wsdl:part name="getDateReturn" type="xsd:dateTime"/>
	</wsdl:message>

<wsdl:message name="getCalendarResponse">
	<wsdl:part name="getCalendarReturn" type="xsd:dateTime"/>
</wsdl:message>
Java2WSDL ツールにより実装された JAX-RPC マッピングは、 java.util.Date インスタンスと java.util.Calendar インスタンスの両方を、XML 型 xsd:dateTime にマップしました。 次のステップは、 生成された WSDL ファイルを使用して Web サービスのクライアントを作成する方法です。 生成された WSDL で WSDL2Java ツールを実行する場合、生成されたクラスには、 server.Test_SEI インターフェースの別のバージョンが含まれます。以下に例を示します。
package server;
public interface Test_SEI extends java.rmi.Remote {
	public java.util.Calendar getCalendar() throws java.rmi.RemoteException;
	public java.util.Date getDate() throws java.rmi.RemoteException;
}

service.Test_SEI インターフェースのクライアント・バージョンは、 getCalendar メソッドと getDate メソッドの両方が java.util.Calendar を戻すという点で、 サーバー・バージョンとは異なります。 クライアントに必要なシリアライゼーショ ンおよびデシリアライゼーション・コードは、サービス・エンドポイント・インターフェースのクライアント・バージョンです。 コンパイル時または実行時に、 サーバー・バージョンがクライアントの CLASSPATH 変数内に誤って表示された場合、エラーが発生します。

NoSuchMethod エラーに加えて、 IncompatibleClassChangeError および ClassCastException も発生する場合があります。 ただしこのような場合には、どんな実行時例外が発生してもおかしくあり ません。ベスト・プラクティスは、 常に、クライアント Web サービス・バインディング・クラスとサーバー Web サービス・バインディング・クラス を分離するように心がけることです。クライアント・バインディング・クラスとサーバー・バインディング・クラスは、 必ず別々のモジュールに入れるようにしてください。 これらのバインディング・クラスが同じアプリケーション内にある場合は、 モジュール間で共有されていないユーティリティー JAR ファイルにバインディング・クラスを入れてください。




関連タスク
Web サービスのトラブルシューティング
関連情報
JAX-RPC アプリケーション用の WSDL2Java コマンド
JAX-RPC アプリケーションの Java2WSDL コマンド
Web サービス: 学習用リソース
参照トピック    

ご利用条件 | フィードバック

最終更新: Jan 21, 2008 8:28:52 PM EST
http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.nd.iseries.doc/info/iseriesnd/ae/rwbs_trbserialize.html