ナビゲーションをスキップ

WebLogic Web サービス プログラマーズ ガイド

  前 次 前/次ボタンと目次ボタンとの区切り線 目次  

トラブルシューティング

この章では、WebLogic Web サービスに関する問題の解決方法について説明します。

 


Web サービスのホーム ページを使用した Web サービスのテスト

WebLogic Server にデプロイされているすべての Web サービスには、ホーム ページがあります。ホーム ページからは、以下の操作ができます。

Web サービスのホーム ページの呼び出しに使用する URL

ブラウザで特定のサービスの Web サービス ホーム ページを呼び出すには、次の URL を使用します。

[protocol]://[host]:[port]/[contextURI]/[serviceURI]

各要素の説明は次のとおりです。

たとえば、次の build.xml ファイルを使用して、servicegen Ant タスクで WebLogic Web サービスをアセンブルしたとします。

<project name="buildWebservice" default="build-ear">
<target name="build-ear">
<servicegen
destEar="myWebService.ear"
warName="myWAR.war"
contextURI="web_services">
<service
ejbJar="myEJB.jar"
targetNamespace="http://www.bea.com/examples/Trader"
serviceName="TraderService"
serviceURI="/TraderService"
generateTypes="True"
expandMethods="True" >
</service>
</servicegen>
</target>
</project>

Web サービスが ariel というホストのデフォルトのポート番号で実行されているとすると、その Web サービスのホーム ページを呼び出す URL は次のとおりです。

http://ariel:7001/web_services/TraderService

Web サービスをテストする

Web サービスのホーム ページには、そのサービスで呼び出すことができるオペレーションの一覧が掲載されています。特定のオペレーションをテストするには、以下の手順に従ってください。

  1. 目的のオペレーションのリンクをクリックします。
  2. 表にパラメータのサンプル値を入力します。表の最初の 2 列にオペレーションの名前と Java データ型が記載されています。
  3. [Invoke] をクリックします。
  4. SOAP のリクエストおよび応答メッセージとオペレーションからの戻り値が、ブラウザの別のウィンドウに表示されます。

また、メインの Web サービス ホーム ページには、オペレーションの 1 つを呼び出す Java コードの例と、clientgen Ant タスクを実行して Web サービス固有のクライアント JAR ファイルを生成する build.xml ファイルのサンプルが表示されます。

 


SOAP メッセージの表示

Web サービス (WebLogic、非 WebLogic のいずれであっても) の呼び出し中にエラーが発生した場合、SOAP のリクエスト メッセージおよび応答メッセージの表示が役立ちます。これはこうしたメッセージによって問題が明らかになることが多いためです。

SOAP のリクエスト メッセージおよび応答メッセージを表示するには、-Dweblogic.webservice.verbose=true フラグを使用してクライアント アプリケーションを実行します。以下に、my.app.RunService というクライアント アプリケーションを実行する例を示します。

prompt> java -Dweblogic.webservice.verbose=true my.app.RunService

SOAP のリクエスト メッセージおよび応答メッセージが、クライアント アプリケーションを実行したコマンド ウィンドウにフル出力されます。

この機能をコンフィグレーションするには、Ant またはプログラムを使用して verbose モードを true に設定します。

Ant による verbose モードの設定

Ant を使用してクライアント アプリケーションを実行する場合、次の例に示すように build.xml ファイルに <sysproperty> 要素を追加することによって verbose モードを設定できます。

<java classname="my.app.RunService">
<sysproperty key="weblogic.webservice.verbose" value="true"/>
</java>

また、WebLogic Server の起動時に -Dweblogic.webservice.verbose=true フラグを指定することによって、デプロイされた WebLogic Web サービスが呼び出されるたびに、SOAP のリクエスト メッセージおよび応答メッセージが出力されるように、WebLogic Server をコンフィグレーションすることもできます。SOAP メッセージは、WebLogic Server を起動したコマンド ウィンドウに出力されます。

注意 : 余分な出力によりパフォーマンスが低下することが考えられるので、この WebLogic Server のフラグは開発段階でのみ設定するようお勧めします。

プログラムによる verbose モードの設定

次の抜粋に示すように、クライアント アプリケーションで weblogic.webservice.binding.BindingInfo.setVerbose(true) メソッドを使用することにより、プログラムで verbose モードを設定できます。

import weblogic.webservice.binding.BindingInfo;
...
   BindingInfo info = 
(BindingInfo)stub._getProperty("weblogic.webservice.bindinginfo" );
   info.setVerbose( true );
port.helloWorld();

この例では、stub は Web サービスの JAX-RPC Stub クラスのインスタンスです。helloWorld() オペレーションが実行されると、SOAP のリクエスト メッセージおよび応答メッセージが、クライアント アプリケーションを実行したコマンド ウィンドウに出力されます。

verbose モードをオフにするには、setVerbose(false) メソッドを呼び出します。

weblogic.webservice.binding パッケージの詳細については、Javadoc を参照してください。

注意 : weblogic.webservice.binding パッケージは WebLogic 独自の API です。

 


HTTP SOAP メッセージのポスト

SOAP メッセージの障害をさらに詳しく解析するためには、リクエストをクライアント アプリケーション経由ではなく直接 SOAP サーバにポストします。そうすることで、SOAP の応答を直接表示できます。クライアント アプリケーションを介さずに SOAP メッセージを直接表示すると、問題を正確に特定できる場合があります。特定できたら、テキスト ファイルを編集して SOAP リクエストの該当箇所を書き換えてから、そのリクエストを再度ポストすることによって、問題の対処法を探れます。

注意 : ここでは、SOAP メッセージの構造を理解していることを前提としています。SOAP の XML スキーマについての詳細な情報が必要な場合は、「Simple Object Access Protocol (SOAP) 1.1」を参照してください。

SOAP リクエストを SOAP サーバに直接ポストするには、以下の手順に従ってください。

  1. HTTP SOAP リクエストを記述したテキスト ファイルを作成します。HTTP SOAP リクエストには HTTP ヘッダと SOAP エンベロープの両方が必要です。このファイルの作成方法については、「SOAP リクエストの構成」を参照してください。次の例は HTTP SOAP リクエストを示します。
POST /asmx/simple.asmx HTTP/1.1 
Host: www.stock.org:7001
Content-Type: text/xml; charset=utf-8
Connection: close
SOAPAction: "http://soapinterop.org/"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://soapinterop.org/"
xmlns:types="http://soapinterop.org/encodedTypes"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<tns:echoString>
<inputString xsi:type="xsd:string">string</inputString>
</tns:echoString>
</soap:Body>
</soap:Envelope>
  1. 次の例に示すように、weblogic.webservice.tools.debug.Post ユーティリティを使用してメッセージを SOAP サーバにポストします。
  2. java weblogic.webservice.tools.debug.Post filename

    ここで filename は、前の手順で作成した HTTP SOAP リクエストが記述されているテキスト ファイルです。Post ユーティリティは、HTTP ヘッダを使用して SOAP サーバの URL を識別します。

  3. SOAP サーバから直接 HTTP SOAP 応答が返信されてくるので、それを詳しく調べて問題解決の手がかりにしてください。

SOAP リクエストの構成

この節では、Web サービスを呼び出すときに WebLogic Web サービスによって生成される整形式の HTTP SOAP リクエストを格納するファイルの作成方法について説明します。

  1. Web サービスの呼び出しで生成される SOAP リクエストをファイルにコピーします。「SOAP メッセージの表示」で説明するように weblogic.webservice.verbose プロパティを使用するか、「Web サービスのホーム ページを使用した Web サービスのテスト」で説明するようにホーム ページから WebLogic Web サービスをテストして、生成された SOAP メッセージを切り取りおよび貼り付けします。
  2. 次の SOAP リクエストは、サンプルの examples.webservices.complex.statelessSession Web サービスの呼び出しから生成されて、Web サービスのホーム ページから切り取って貼り付けたものです。

    <env:Envelope  xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <env:Header>
    </env:Header>
    <env:Body
    env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <m:sell xmlns:m="http://www.bea.com/examples/Trader">
    <string xsi:type="xsd:string">sample string</string>
    <intVal xsi:type="xsd:int">100</intVal>
    </m:sell>
    </env:Body>
    </env:Envelope>
  3. デフォルトでは、生成された SOAP リクエストには標準の XML 宣言が含まれていないため、次の太字で示す行をファイルの先頭に追加します。
  4. <?xml version="1.0" encoding="utf-8"?>
    <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    ...
  5. XMLSpy などの XML エディタで開いて必要に応じて編集し、XML を整形式にします。XMLSpy は BEA WebLogic Platform と共にインストールされる製品です。
  6. ファイルの先頭に必要な HTTP ヘッダを追加します。次の例に太字で示すように、適切な Host および POST ヘッダ値を指定します。
  7. POST /filetransferAtResponse/FTService HTTP/1.1
    Host: localhost:7001
    Content-Type: text/xml; charset=utf-8
    Connection: close
    SOAPAction: ""
    <?xml version="1.0" encoding="utf-8"?>
    <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    ...

    HTTP はリクエストを解析する際に構造に関して非常に厳密であるため、整形式の HTTP リクエストを作成するようにしてください。特に、次の点を確認してください。

これで、SOAP サーバにポストするのに適した HTTP SOAP リクエストが用意されます。

 


WSDL に関する問題のデバッグ

Web サービスの呼び出し時に発生する問題の原因としてもう 1 つ考えられるのは、WSDL が無効であることです。問題のある公開済みの WSDL を修正することはユーザの責任外であるかもしれませんが、問題箇所を正確に特定し、それをプロバイダに知らせて修正してもらうことはできます。

注意 : ここでは、WSDL ファイルの構造を理解していることを前提としています。WSDL の XML スキーマについての詳細な情報が必要な場合は、「Web Services Description Language (WSDL) 1.1」を参照してください。

この節では、WSDL ファイルに関して考えられる問題をすべて取り上げるのではなく、以下の一般的な問題についてのみ記述します。

 


WSDL ファイルの検証

WSDL が WebLogic Web サービスと互換性があるかを確認するには、次の例に示すように clientgen Ant タスクと wsdl 属性を使用します。

<clientgen wsdl="http://example.com/myapp/myservice.wsdl"
packageName="myapp.myservice.client"
clientJar="myapps/myService_client.jar"
/>

この clientgen Ant タスクが異常なく完了すれば、WSDL は互換性があり、整形式です。

 


XML スキーマの検証

XML スキーマが WebLogic Web サービスと互換性があるかを確認するには、次の例に示すように autotype Ant タスクと schemaFile 属性を使用します。

<autotype schemaFile="my-schema.xsd"
packageName="foo"
destDir="temp_dir"
/>

この autotype Ant タスクが異常なく完了すれば、XML スキーマは互換性があり、整形式です。

 


データ型生成 (オートタイピング) に関する問題のデバッグ

servicegenautotype、または clientgen Ant タスクを使用して非組み込みデータ型のオートタイピング コンポーネント (シリアライゼーション クラス、Java または XML 表現など) を作成しているときにエラーが発生した場合は、weblogic.xml.schema.binding.verbose=true プロパティを設定すると、実行中のオートタイピング アクティビティについての詳細な情報を出力できます。この情報を使用して、問題の原因を調べられます。

次の例に示すように、このプロパティは、コマンドライン版の autotype または clientgen Ant タスクを使用するときに設定できます。

java -Dweblogic.xml.schema.binding.verbose=true \
weblogic.webservice.clientgen -wsdl foo.wsdl \
-clientJar /tmp/test_client.jar -packageName foo

XML スキーマの一般的な問題

次に、WebLogic Server のオートタイピング機能 (autotypeservicegen、または clientgen Ant タスク) を使用して非組み込み XML データ型のシリアライゼーション クラスおよび Java 表現を生成する際によく発生する、XML スキーマの問題を示します。

Java に関する一般的な問題

次に、WebLogic Server のオートタイピング機能 (autotypeservicegen、または clientgen Ant タスク) を使用して非組み込み Java データ型のシリアライゼーション クラスおよび XML スキーマ表現を生成する際によく発生する、Java クラスの問題を示します。

 


パフォーマンスに関する問題のデバッグ

Web サービスでは、メッセージ プロトコルとして SOAP を使用します。多くの場合、他のバイナリ プロトコルの方がパフォーマンスに優れています。たとえば、Web サービスを毎秒 300 回呼び出すことができた場合、RMI を使用すれば同じメソッドを毎秒 1,500 回呼び出せることもあります。

Web サービスのパフォーマンスを決める主な要因を、影響度の高いものから順に挙げると以下のようになります。

一般に、Web サービスのパフォーマンスに最も影響するのは HTTP です。これがユーザの WebLogic Web サービスに当てはまるかどうかを判断するには、以下のガイドラインに従ってください。

  1. Web サービスの呼び出しに使用する SOAP メッセージの受信と SOAP 応答メッセージの返信だけを行うサーブレットを作成します。このサーブレットでは他の処理 (XML と Java 間のデータ変換など) を行わないでください。SOAP のリクエストと応答を取得する方法の詳細については、「SOAP メッセージの表示」を参照してください。
  2. 標準的な方法で Web サービスを呼び出すのにかかった時間を計測します。
  3. SOAP リクエストをサーブレットに送信し、クライアントが応答を受信するのに要した時間を計測します。
  4. 通常は、標準的な方法による Web サービスの呼び出しの方が、サーブレットへの SOAP メッセージ送信よりも少しだけ長く時間がかかります。測定結果もそうであれば、HTTP が主な原因であるため、呼び出し速度の向上はほとんど望めません。しかし、サーブレットの使用に比べて Web サービスの呼び出しの方がはるかに長い時間 (たとえば 2 倍) がかかっている場合には、他の要因を考慮に入れることができます。Web サービスのパフォーマンスを改善する方法については、「パフォーマンスに関するヒント」を参照してください。

 


パフォーマンスに関するヒント

パフォーマンスに関して、WebLogic Web サービスをプログラミングする際に留意すべき事項を示します。

 


障害時における IP アドレス解決の再実行

WebLogic のクライアント JAR ファイルを使用しているクライアント アプリケーションは、Web サービスを最初に呼び出したときにその Web サービスが動作しているコンピュータの IP アドレスをキャッシュします。デフォルトでは、ここでキャッシュされたアドレスは新しく DNS がルックアップされるまでリフレッシュされません。そのため、Web サービスを呼び出した後にその Web サービスの動作しているコンピュータがクラッシュし、別の IP アドレスを持つ他のコンピュータでその機能を引き継いだ場合に、同じクライアント アプリケーションから再び Web サービスを呼び出そうとすると、呼び出しは失敗します。クライアント アプリケーションでは、以前にキャッシュした IP アドレスを持つコンピュータで引き続き Web サービスが動作していると見なすためです。つまり、新規に DNS をルックアップして再度 IP アドレスを解決しようとはせず、以前のルックアップでキャッシュされた情報を使用します。

この問題を解決するには、クライアント アプリケーションを更新して、JDK 1.4 のシステム プロパティの sun.net.inetaddr.ttl に、アプリケーションが IP アドレスをキャッシュしておく秒数を設定します。

 


clientgen または autotype Ant タスクの実行時の BindingException

clientgen または autotype Ant タスクと wsdl 属性を使用して WSDL ファイルからクライアントまたはデータ型コンポーネントを生成する場合、次の例外が発生する場合があります。

weblogic.webservice.tools.build.WSBuildException: Failed to do type mapping - with nested exception: 
[weblogic.xml.schema.binding.BindingException: unable to find a definition for type datatype

この例外は、Web サービスで使用される XML スキーマ データ型を記述する WSDL ファイルのセクションに未定義のデータ型が存在することを示しています。この問題を解決するには、WSDL ファイルにデータ型定義を追加します。

 


WebLogic Web サービスのクライアントを使用してサードパーティ SSL サーバに接続するときのクライアント エラー

クライアント アプリケーションで SSL の WebLogic クライアントサイド実装を使用して、サードパーティの SSL サーバ (OpenSSL など) に接続できます。そのためには、次の例のように weblogic.webservice.client https プロトコル ハンドラを指定します。

-Djava.protocol.handler.pkgs=weblogic.webservice.client

ただし、WebLogic クライアントサイド SSL の実装方法が原因で、次のコード例のように、SSLAdapter クラスを使用して SSL サーバとの URL 接続を開き、InputStream を取得する必要があります。

SSLAdapter adapter = 
SSLAdapterFactory.getDefaultFactory().getSSLAdapter();
InputStream in = adapter.openConnection(url).getInputStream();

このコードは、次の例のような接続を開く汎用コードの代わりに使用します。

URLConnection con = url.openConnection();
InputStream in = con.getInputStream();

例のようにして SSLAdapter クラスを使用しないと、クライアントの実行時に次のようなエラーが発生します。

Exception: FATAL Alert:BAD_CERTIFICATE - A corrupt or unuseable certificate was received

 


抽象型を返すオペレーションを呼び出すときのクライアント エラー

抽象型を返すメソッドで実装された Web サービスのオペレーションをクライアントが呼び出すと、次のエラーが発生する場合があります。

java.lang.Error: cannot create abstract type: my.abstractType

このエラーが発生する正確なシナリオは次のとおりです。

abstract class Foo { }
class Bar extends Foo {}
class MyService {
public Foo getFoo() {
return new Bar();
}
}

このため、getFoo() メソッドのシグネチャで Foo オブジェクトを返すように指定されていても、そのメソッドの実装の実際の return 文は Bar オブジェクト (抽象 Foo を拡張) を返します。

このシナリオでは、Bar クラスの autotype Ant タスクを明示的に実行してシリアライゼーション コンポーネントを生成してから、MyService クラスの autotype を実行することが重要です。MyService クラスでの 2 回目の autotype の実行では、Foo 抽象クラスのシリアライゼーション コンポーネントが自動的に生成されます (それが getFoo() メソッドの明示的な戻り値であるため)。2 回の autotype タスクを逆の順序で実行すると、Ant タスクそれ自体を実行してエラーがない場合でも、getFoo() メソッドで実装された Web サービス オペレーションを呼び出そうとしたときにエラーが発生します。

build.xml ファイルから抜粋した次のコードは、2 回の autotype Ant タスクを正しい順序で実行する例を示しています。

<autotype
      javaTypes="Bar"
targetNamespace="com.bea.example"
packageName="com.bea.example"
keepGenerated="True"
destDir="${classes}">
<classpath>
<path refid="project.classpath"/>
<pathelement path="${classes}"/>
</classpath>
</autotype>
    <autotype
javaComponents="MyService"
targetNamespace="com.bea.example"
typeMappingFile="${classes}/types.xml"
packageName="com.bea.example"
keepGenerated="True"
destDir="${classes}">
<classpath>
<path refid="project.classpath"/>
<pathelement path="${classes}"/>
</classpath>
</autotype>

注意 : MyService クラスで servicegen Ant タスクを使用して、このシナリオのすべてのシリアライゼーション コンポーネントを生成することはできません。それは、servicegen Ant タスクが Bar クラスのコンポーネントを生成することを知らないからです。このクラスは、MyService クラスのメソッドのシグネチャに明示的には現れません。

 


空にできる省略可能な、空の XML 要素を SOAP メッセージに含める

WebLogic Server が Web サービス操作に対する SOAP 応答を生成するときに、戻り値の XML 要素のいずれかが空にできる省略可能な要素として定義されており (つまり、その要素の XML スキーマ定義に nillable="true" および minOccurs="0" 属性が含まれている)、その要素に関連付けられている実際のデータがない場合、その要素は SOAP 応答に含まれなくなります。この動作は WebLogic Server のバグではありませんが、予期されないものであり、さまざまなクライアントがその Web サービスを呼び出す場合に相互運用性の問題を引き起こす可能性があります。

たとえば、Web サービスの WSDL で ProductType XML データ型を次のように定義しているとします。

<xsd:complexType name="ProductType">
   <xsd:sequence>
    <xsd:element type="xsd:string" name="ID" 
minOccurs="0" nillable="true"/>
<xsd:element type="xsd:string" name="Name"
minOccurs="0" nillable="true"/>
<xsd:element type="xsd:string" name="Description"
minOccurs="0" nillable="true"/>
</xsd:sequence>
</xsd:complexType>

さらに、Web サービス操作が Product (型は ProductType) を返し、特定の呼び出しで製品の説明がないために Description 要素が空であると想定します。WebLogic Server は次のような SOAP 応答を生成します。

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/";
xmlns:xsd="http://www.w3.org/2001/XMLSchema";>
<env:Header/>
<env:Body>
<n1:Product xmlns:n1="http://mycompany.com/mywebservice"; >
<n1:ID>1234</n1:ID>
<n1:Name>MyFabProduct</n1:Name>
</n1:Product>
</env:Body>
</env:Envelope>

<n1:Product> 要素には <n1:Description> 子要素がまったく含まれていません。

XML 要素が省略可能でない場合 (minOccurs="1") は、この動作が変わります。この場合、SOAP 応答には xsi:nil="true" 属性の付いた空の要素が含まれます。次の例を参照してください。

...
<n1:Product xmlns:n1="http://mycompany.com/mywebservice"; >
<n1:ID>1234</n1:ID>
<n1:Name>MyFabProduct</n1:Name>
<n1:Description xsi:nil="true"></n1:Description>
</n1:Product>
...

これは WebLogic Server のバグではありません。動作の相違は XML Schema Part 0: Primer 仕様の曖昧さによって生じます。この仕様では minOccurs="1" の場合に発生する動作については明確に記述されていますが、minOccurs="0" の場合については明確ではありません。

要素に内容がない場合でも、空にできる省略可能な XML 要素が SOAP 応答に常に含まれるようにするには、次のいずれかを実行します。

 


HTTPS を使用して Web サービスを呼び出す場合の SSLKeyException

エンドポイント URL で HTTPS を使用している Web サービスを、クライアント アプリケーションが初めて呼び出す場合、アプリケーションは次のようなエラーを取得する可能性があります。

[java]  </bea_fault:stacktrace>javax.net.ssl.SSLKeyException: FATAL 
Alert:BAD_CERTIFICATE - A corrupt or unuseable certificate was received.

これは、たとえば、最初に clientgen Ant タスクを実行して、エンドポイント アドレスに HTTP を使用している WSDL からスタブを生成し、この Web サービスを呼び出すクライアント アプリケーションを作成してから、javax.xml.rpc.Stub インタフェースの ENDPOINT_ADDRESS_PROPERTY プロパティを設定して、クライアント アプリケーションで HTTPS (したがって SSL) を使用するエンドポイント アドレスに切り替える場合などに発生します。次の例を参照してください。

String url = "https://localhost:7002/webservice/TraderService";
((javax.xml.rpc.Stub )trader)._setProperty
(javax.xml.rpc.Stub.ENDPOINT_ADDRESS_PROPERTY, url);

この場合の問題は、クライアント アプリケーションが WLSSLAdapter クラスを使用して SSL に必要なクライアント証明書をロードしていない点にあると考えられます。問題は HTTPS を使用する場合にのみ発生しており、HTTP を使用する Web サービスを呼び出すときに問題が発生しなかったのはそのためです。

問題を解決するには、WLSSLAdapter.setTrustedCertificateFile() メソッド (一方向 SSL の場合) または WLSSLAdapter.loadLocalIdentity() メソッド (双方向 SSL の場合) を使用してクライアント証明書をロードします。次の例を参照してください。

SSLAdapterFactory factory = SSLAdapterFactory.getDefaultFactory();
WLSSLAdapter adapter = (WLSSLAdapter) factory.getSSLAdapter();
// 一方向 SSL の場合は、次の行のコメントを解除してクライアント証明書をロードする
// adapter.setTrustedCertificatesFile("mytrustedcerts.pem");
// 双方向 SSL の場合は、次の行のコメントを解除してクライアント証明書をロードする
// adapter.loadLocalIdentity(clientCredentialFile, pwd.toCharArray());

 


Autotype Ant タスクが指定したすべての Java 型に対してシリアライゼーション クラスを生成しない場合

autotype Ant タスクを使用して、同じクラス名を持つが別々のパッケージに入っている一連の Java データ型のシリアライゼーション クラスを生成する場合、packageName 属性を指定しないようにしてください。指定すると、autotype Ant タスクは、指定されたすべての Java データ型ではなく、最後の Java データ型についてのみ、シリアライゼーション クラスを生成します。

たとえば、次の Java データ型のシリアライゼーション クラスを生成するとします。

build.xml ファイル内における以下のサンプル autotype Ant タスクは正しく指定されており、2 つの Java データ型のシリアライゼーション クラスが生成されます。

 <autotype 
destDir="/output/type_defs"
javaTypes="mypackage.MyClass,mypackage.test.MyClass"
keepGenerated="True"
overwrite="True">
<classpath refid="client.classpath"/>
</autotype>

以下の autotype の指定は正しくありません。生成されるシリアライゼーション クラスは 1 つ (mypackage.test.MyClass クラスのためのもの) のみです。

 <autotype 
destDir="/output/type_defs"
javaTypes="mypackage.MyClass,mypackage.test.MyClass"
keepGenerated="True"
overwrite="True"
packageName="mypackage">
<classpath refid="client.classpath"/>
</autotype>

 


非セキュア Web サービスを呼び出すとクライアントに HTTP 401 エラーが発生する場合

Web サービス呼び出し時に、クライアント アプリケーションの SOAP リクエストに Authorization HTTP ヘッダが含まれていれば、Web サービスのコンフィグレーションでアクセス制御のセキュリティ制約が設定されていない場合でも、WebLogic Server は HTTP 401 Error: Unauthorized Access によってそのリクエストを拒否します。これは、Web アプリケーションが同じ状況を処理する場合とは異なります。Web アプリケーションは Web アプリケーションでセキュリティ制約が指定されていなければ、Authorization HTTP ヘッダを無視します。

Web サービスでも Web アプリケーションのような処理を行う場合は、次の例に示すように、Web サービスをアセンブルする servicegen または source2wsdd Ant タスクの ignoreAuthHeader="True" 属性を設定します。

<servicegen
destEar="ears/myWebService.ear"
warName="myWAR.war">
<service
javaClassComponents="examples.webservices.basic.javaclass.HelloWorld"
targetNamespace="http://www.bea.com/examples/HelloWorld"
serviceName="HelloWorld"
serviceURI="/HelloWorld"
generateTypes="True"
ignoreAuthHeader="True"
expandMethods="True">
</service>
</servicegen>

この属性を Ant タスクで設定すると、生成された web-services.xml デプロイメント記述子内の Web サービスを記述する <web-service> 要素の ignoreAuthHeader="True" 属性が設定されます。

警告 : ignoreAuthHeader 属性の使用は慎重に行ってください。この属性の値を True に設定すると、WebLogic Server は、たとえアクセス制御のセキュリティ制約が Web サービスを構成する EJB、Web アプリケーション、またはエンタープライズ アプリケーションに対して定義されていても、Web サービスを呼び出そうとしているクライアント アプリケーションの認証を行いません。つまり、認証資格を提供しないクライアント アプリケーションでも、セキュリティ制約が定義されていれば、Web サービスを呼び出すことが可能となります。

 


JMS 転送を使用した非同期 Web サービスが WebLogic Server からの応答メッセージを受信しない場合

クライアント アプリケーションからの Web サービスの呼び出しに JMS 転送を使用できるように、WebLogic Web サービスをコンフィグレーションすることができます。この機能については、「JMS 転送を使用した WebLogic Web サービスの呼び出し」を参照してください。また、Web サービスのオペレーションを非同期に呼び出すようにクライアント アプリケーションを記述することができます。この場合、クライアント アプリケーションはまず、結果を待つことなくオペレーションを呼び出し、次に必要に応じて、その後の手順で呼び出し結果を取得します。この機能については、「非同期クライアント アプリケーションの記述」を参照してください。

ただし、2 つの機能を一緒に使用する場合、状況によっては、クライアント アプリケーションは、Web サービスのオペレーションの最初の呼び出しの結果を含む WebLogic Server からの非同期応答メッセージを、まったく受信しないことがあります。特に、非同期クライアント アプリケーションがオペレーションを呼び出したが、そのオペレーションの結果に対する 2 回目のリクエストを呼び出せないでいるうちに、WebLogic Server が再起動した場合を考えます。WebLogic Server では、再起動後、クライアントに送り返された応答メッセージがあることを認識しますが、この応答の送信先が分かりません。したがって、非同期クライアント アプリケーションがこれを受信することはありません。これは、Web サービスの非同期クライアントが実装の際に永続的な JMS 送り先ではなく、一時的な JMS 送り先を使用しており、WebLogic Server からのこの一時的な送り先への参照が、再起動後には失われるためです。

 


大きな WSDL ファイルに対して autotype Ant タスクを実行すると java.lang.OutOfMemoryError が返される場合

非常に大きな WSDL ファイルに対して autotype Ant タスクを実行すると、コンピュータがリソース不足に陥って以下のいずれかのエラーが返されることがあります。

The system is out of resources.
Consult the following stack trace for details. java.lang.OutOfMemoryError
package weblogic.xml.schema.binding.internal.builtin does not exist

この問題を解消するには、ヒープ サイズを最低でも 512M に増やして、Ant タスクが使用する java コマンドのメモリを拡張します。

具体的には、BEA_HOME/weblogic81/server/bin ディレクトリにある ant.bat ファイルを更新します。ここで、BEA_HOME は BEA Products の主なインストール先ディレクトリ (c:/bea など) です。このファイルの各 :runAnt ラベル内で使用されている %_JAVACMD% 変数に -Xmx512m オプションを追加します。次に例を示します。

:runAnt
"%_JAVACMD%" -Xmx512m -classpath "%LOCALCLASSPATH%" -Dant.home="%ANT_HOME%"
%ANT_OPTS% org.apache.tools.ant.Main %ANT_ARGS% %ANT_CMD_LINE_ARGS%
if errorlevel 1 exit /b 1
goto end

 


UDDI エクスプローラにログオンしようとするときのエラー

WebLogic Server をインストールしたユーザとは別のユーザが WebLogic Server ドメインを作成した場合、ユーザが UDDI エクスプローラにログオンしようとすると次のエラーが返されます。

An error has occurred
E_fatalError(10500): a serious technical error has occurred while
processing the request.'Exception while attempting to instantiate
subclass of DataReader: com.acumenat.uddi.persistence.ldap.LDAPInit'

この問題を解決するには、WebLogic Server 管理者は uddi.properties ファイルのパーミッションを変更してすべてのユーザがアクセスできるようにする必要があります。UDDI サーバのコンフィグレーションに使用される uddi.properties ファイルは WL_HOME/server/lib ディレクトリにあります。WL_HOME は WebLogic Platform のメイン ディレクトリです。

 


JAX-RPC に準拠しないデータ型

autotype Ant タスクは、XML スキーマのデータ型 (Java 表現を生成する対象) に特定の特性がある場合は JAX-RPC 仕様に準拠しません。詳細については、「JAX-RPC に準拠しないデータ型」を参照してください。

 

フッタのナビゲーションのスキップ  ページの先頭 前 次