WebLogic Web サービス プログラマーズ ガイド
![]() |
![]() |
![]() |
![]() |
この章では、WebLogic Web サービスに関する問題の解決方法について説明します。
WebLogic Server にデプロイされているすべての Web サービスには、ホーム ページがあります。ホーム ページからは、以下の操作ができます。
ブラウザで特定のサービスの Web サービス ホーム ページを呼び出すには、次の URL を使用します。
[protocol
]://[host
]:[port
]/[contextURI
]/[serviceURI
]
http
か https
のいずれか。この値は、web-services.xml
ファイルにある、Web サービスを記述する <web-service>
要素の protocol
属性に対応します。servicegen
Ant タスクを使用して Web サービスをアセンブルした場合は、この値は protocol
属性に対応します。7001
) を指す。application.xml
デプロイメント記述子の <context-root>
要素に対応する。servicegen
Ant タスクを使用して Web サービスをアセンブルした場合は、この値は contextURI
属性に対応します。 application.xml
ファイルに <context-root>
要素がない場合は、contextURI
の値は、Web アプリケーションのアーカイブ ファイルまたは展開ディレクトリの名前です。
web-services.xml
ファイルにある <web-service>
要素の uri
属性に対応します。servicegen
Ant タスクを使用して Web サービスをアセンブルした場合は、この値は 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 つを呼び出す Java コードの例と、clientgen
Ant タスクを実行して Web サービス固有のクライアント JAR ファイルを生成する build.xml
ファイルのサンプルが表示されます。
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 を使用してクライアント アプリケーションを実行する場合、次の例に示すように 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 のフラグは開発段階でのみ設定するようお勧めします。
次の抜粋に示すように、クライアント アプリケーションで 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 です。
SOAP メッセージの障害をさらに詳しく解析するためには、リクエストをクライアント アプリケーション経由ではなく直接 SOAP サーバにポストします。そうすることで、SOAP の応答を直接表示できます。クライアント アプリケーションを介さずに SOAP メッセージを直接表示すると、問題を正確に特定できる場合があります。特定できたら、テキスト ファイルを編集して SOAP リクエストの該当箇所を書き換えてから、そのリクエストを再度ポストすることによって、問題の対処法を探れます。
注意 : ここでは、SOAP メッセージの構造を理解していることを前提としています。SOAP の XML スキーマについての詳細な情報が必要な場合は、「Simple Object Access Protocol (SOAP) 1.1」を参照してください。
SOAP リクエストを 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>
この節では、Web サービスを呼び出すときに WebLogic Web サービスによって生成される整形式の HTTP SOAP リクエストを格納するファイルの作成方法について説明します。
weblogic.webservice.verbose
プロパティを使用するか、「Web サービスのホーム ページを使用した Web サービスのテスト」で説明するようにホーム ページから WebLogic Web サービスをテストして、生成された SOAP メッセージを切り取りおよび貼り付けします。次の 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>
<?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"
...
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"
...
これで、SOAP サーバにポストするのに適した HTTP SOAP リクエストが用意されます。
Web サービスの呼び出し時に発生する問題の原因としてもう 1 つ考えられるのは、WSDL が無効であることです。問題のある公開済みの WSDL を修正することはユーザの責任外であるかもしれませんが、問題箇所を正確に特定し、それをプロバイダに知らせて修正してもらうことはできます。
注意 : ここでは、WSDL ファイルの構造を理解していることを前提としています。WSDL の XML スキーマについての詳細な情報が必要な場合は、「Web Services Description Language (WSDL) 1.1」を参照してください。
この節では、WSDL ファイルに関して考えられる問題をすべて取り上げるのではなく、以下の一般的な問題についてのみ記述します。
<service>
要素にあります。
<service name="myservice>
<port name="myport" binding="tns:mybinding">
<soap address="http://a_host:4321/service" />
</port>
</service>
たとえば、<binding>
要素の type
属性は、次の例に示すように <portType>
要素の name
属性を参照します。
<binding
name="my-binding"type="tns:my-port"
>
<operation name="foo">
<input />
<output />
</operation>
</binding>
<portType name="my-port"
>
<operation name="foo">
<input message="tns:fooReq" />
<output message="tns:fooRes" />
</operation>
</portType>
ここで、<portType>
要素の name
属性の値が my-port1
である場合、<binding>
要素からの参照は無効になり、この WSDL に記述された Web サービスの呼び出しは失敗します。
<import>
要素の問題。WSDL では、次のように <import>
要素を使用したドキュメントの場所とネームスペースの関連付けが可能です。
<definitions ....>
<import
namespace="http://example.com/stockquote/definitions"
location="http://example.com/stockquote/stockquote.wsdl"/>
</definitions>
location
属性で指定された WSDL 自体に、別の WSDL を指定する import 文が含まれている場合があります。これはより明確な Web サービス定義を作成するうえでは有効なテクニックですが、その定義を抽象化レベルに応じて分離するため、抽象化レイヤが多数ある場合には障害の原因になるおそれもあります。その場合は、インポートするすべての 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 スキーマが WebLogic Web サービスと互換性があるかを確認するには、次の例に示すように autotype
Ant タスクと schemaFile
属性を使用します。
<autotype schemaFile="my-schema.xsd"
packageName="foo"
destDir="temp_dir"
/>
この autotype
Ant タスクが異常なく完了すれば、XML スキーマは互換性があり、整形式です。
servicegen
、autotype
、または 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
次に、WebLogic Server のオートタイピング機能 (autotype
、servicegen
、または clientgen
Ant タスク) を使用して非組み込み XML データ型のシリアライゼーション クラスおよび Java 表現を生成する際によく発生する、XML スキーマの問題を示します。
次に、WebLogic Server のオートタイピング機能 (autotype
、servicegen
、または clientgen
Ant タスク) を使用して非組み込み Java データ型のシリアライゼーション クラスおよび XML スキーマ表現を生成する際によく発生する、Java クラスの問題を示します。
Web サービスでは、メッセージ プロトコルとして SOAP を使用します。多くの場合、他のバイナリ プロトコルの方がパフォーマンスに優れています。たとえば、Web サービスを毎秒 300 回呼び出すことができた場合、RMI を使用すれば同じメソッドを毎秒 1,500 回呼び出せることもあります。
Web サービスのパフォーマンスを決める主な要因を、影響度の高いものから順に挙げると以下のようになります。
一般に、Web サービスのパフォーマンスに最も影響するのは HTTP です。これがユーザの WebLogic Web サービスに当てはまるかどうかを判断するには、以下のガイドラインに従ってください。
パフォーマンスに関して、WebLogic Web サービスをプログラミングする際に留意すべき事項を示します。
us-ascii
文字セットを使用する。この文字セットは処理が最も効率的で高速です。詳細については、「WebLogic Web サービスの文字セットを指定する」を参照してください。
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 タスクと 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 ファイルにデータ型定義を追加します。
クライアント アプリケーションで 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
クラスのメソッドのシグネチャに明示的には現れません。
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 応答に常に含まれるようにするには、次のいずれかを実行します。
setXXX(null)
メソッドを使用して、対応する Java オブジェクトの値を明示的に null
に設定します。nillable="true"
の XML 要素にはすべて minOccurs="1"
属性も設定します。ただし、この方法は常に実行可能なわけではないため、上記の回避策をお勧めします。
エンドポイント 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 データ型のシリアライゼーション クラスを生成する場合、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 サービス呼び出し時に、クライアント アプリケーションの 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 サービスを呼び出すことが可能となります。
クライアント アプリケーションからの 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 タスクを実行すると、コンピュータがリソース不足に陥って以下のいずれかのエラーが返されることがあります。
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
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 のメイン ディレクトリです。
autotype
Ant タスクは、XML スキーマのデータ型 (Java 表現を生成する対象) に特定の特性がある場合は JAX-RPC 仕様に準拠しません。詳細については、「JAX-RPC に準拠しないデータ型」を参照してください。
![]() ![]() |
![]() |
![]() |