トラブルシューティングこの付録では、Oracle Application Server Web Servicesの使用時に発生する可能性のある問題の解決策を提供します。この付録の項のタイトルは、『Oracle Application Server Web Services開発者ガイド』および『Oracle Application Server Web Servicesアドバンスト開発者ガイド』の章タイトルに対応しています。
配列値要素をコレクション型にシリアライズまたはデシリアライズできない
rpc-encodedのWebサービスでJavaコレクション型(java.util.Map、java.util.Collectionまたはこれらのサブクラスなど)をパラメータ型または戻り型として使用する場合、ランタイムでは、これらのコレクション・パラメータに配列値要素を正しくシリアライズまたはデシリアライズできません。
rpc-encodedのメッセージ書式の使用時に、Java配列タイプ用にシリアライザおよびデシリアライザが登録されるようにするには、Java値タイプを作成して各Java配列を表現します。
使用するJava配列タイプごとにJava値タイプを作成します。
|
注意: Java値タイプの名前の中には、「Array」という語を使用しないようにします。「Array」は予約済のパターンです。 |
次の例は、demo/StringAry.javaファイルの内容を表現しています。ラッパー・クラスのStringAryは、JavaのString[]配列を表現しています。クラス名の接尾辞に「Ary」が使用されていることに注意してください。
package demo;
public class StringAry
{ public StringAry() { }
public String[] getValue() { return m_value; }
public void setValue(String[] value) { m_value=value; }
private String[] m_value;
}
すべての値タイプ用に、適切なシリアライザおよびデシリアライザが登録されるようにします。
それには、Webサービスのアセンブルの際にvalueType引数を使用します。次の例では、この引数に、ステップ1で作成されたdemo/StringAry.javaファイルを指定しています。
java wsa.jar -assemble -valueType demo.StringAry ...
コレクション型パラメータにおける配列値要素の設定および取得用に定義した値タイプを使用します。
たとえば、次のクラス定義があるとします。
package demo;
public class Service extends java.rmi.Remote
{ java.util.Map getMap(String input)throws java.rmi.RemoteException
{ ... }
}
次のコードを記述して、配列値要素の1つとしてString[]値をマップに戻すことができます。
HashMap map = new HashMap();
String[] str_array = new String[]{"a","b","c"};
StringAry sa = new StringAry();
sa.setValue(str_array);
map.put("myArray", sa);
return map;
多次元配列を使用するWebサービスの公開時にエラーが発生した
多次元配列を使用するWebサービスを公開しようとするとエラーが発生します。たとえば、入力または戻り引数として多次元配列を取るメソッドがあるJavaクラスを公開しようとすると、エラーが戻されることがあります。
この問題の解決策としては次の2つが考えられます。
配列の次元ごとのJavaBeanの作成
rpc-encodedのメッセージ書式を使用したWebサービスの公開
配列の次元ごとのJavaBeanの作成: 配列の各次元をJava値タイプにラップして制限を回避できます。
|
注意: Java値タイプの名前の中には、「Array」という語を使用しないようにします。「Array」は予約済のパターンです。 |
次の例では、public static class StringAryにより、文字列の内部配列をラップしています。public StringAry[]により、内部配列の配列を表現しています。すなわち、String Java値タイプの配列を含んでいます。このコード・サンプル内で接尾辞「Ary」が使用されていることに注意してください。
package demo;
public interface SampleItf extends java.rmi.Remote
// wrap the inner array as a Java value type
{ public static class StringAry
{ public StringAry() { }
public String[] getValue() { return m_value; }
public void setValue(String[] value) { m_value=value; }
private String[] m_value;
}
// create an array of the inner array elements
public StringAry[] echoString2(StringAry[] input)
throws java.rmi.RemoteException;
}
次のSampleクラスで示されているのは、String Java値タイプのStringAry[]配列を公開する方法です。
package demo;
public class Sample implements java.rmi.Remote, SampleItf
{ public SampleItf.StringAry[] echoString2(SampleItf.StringAry[] input)
throws java.rmi.RemoteException
{ return input; }
}
rpc-encodedスタイルを使用してWebサービスを公開する方法: rpc-encodedスタイルを使用して、多次元配列を使用するWebサービスを公開できます。次に例を示します。
package demo;
public interface SampleItf extends java.rmi.Remote
{ public String[][] echoString2(String[][] input)
throws java.rmi.RemoteException;
}
package demo;
public class Sample implements java.rmi.Remote, SampleItf
{ public String[][] echoString2(String[][] input)
throws java.rmi.RemoteException
{ return input; }
}
レスポンスまたはリクエストの処理中にデシリアライズ・エラーが発生した
デシリアライズの手順実行中にOracleAS Webサービスでスキーマ検証を実行しようとすると、このエラーが発生します。wsdl:types要素に存在するスキーマ定義とワイヤ書式のSOAPペイロードの書式の間の不一致が、エラーの原因です。
クライアント・プロキシをgenProxyでアセンブルし、サーバーからのレスポンスをデシリアライズしようとすると、このエラーが発生します。サーバーでリクエストをデシリアライズしようとすると発生します。
次の例に、ワイヤ書式とWSDLの間の要素の順序の不一致を示します。デシリアライズ・コードがワイヤ書式でParentItemIdを処理する場合、スキーマでQuantityおよびPrePick要素をスキップします。ワイヤ書式のPrePickはParentItemIdの後に予期されていない要素のため、処理に失敗します。
ワイヤ書式
... <ListOfProduct> <Product> <ParentItemId></ParentItemId> <PrePick>Y</PrePick> <Quantity>1</Quantity> ...
WSDL定義
...
<xsd:complexType name="Product">
<xsd:sequence>
<xsd:element name="Quantity" maxOccurs="1" minOccurs="0"
type="xsd:string"></xsd:element>
<xsd:element name="PrePick" maxOccurs="1" minOccurs="0"
type="xsdLocal11:string1"></xsd:element>
<xsd:element name="ParentItemId" maxOccurs="1" minOccurs="0"
type="xsdLocal11:string30"></xsd:element>
...
次に、この状況でスローされる可能性があるデシリアライズ・エラーの例を示します。
unexpected element name:
expected={http://myCompany.com/Catalog/Data/CategoryProduct}Description,
actual={http://myCompany.com/Catalog/Data/CategoryProduct}PrePick.
at oracle.j2ee.ws.common.util.exception.JAXRPCExceptionBase.<init>(JAXRPCExceptio nBase.java:93)
at oracle.j2ee.ws.common.util.exception.JAXRPCExceptionBase.<init>(JAXRPCExceptio nBase.java:111)
at oracle.j2ee.ws.common.encoding.DeserializationException.<init>(Deserialization Exception.java:54)
at com.myCompany.catalog.data.categoryproduct.runtime.Product_LiteralSerializer.doDeserialize(Product_Literal Serializer.java:471).
このエラーを回避するには、次の方法が考えられます。
サービス実装を変更し、ワイヤ書式をWSDLの書式と一致させます。
この解決策は、サービス実装が制御可能で、トップダウン方式でWebサービス・アセンブルする場合にのみ使用できます。スキーマ定義とSOAPペイロードとの間の不一致は、規約を実装した際のレスポンスの書式設定のエラーが原因である可能性があります。SAAJ APIを使用している(dataBinding=falseを指定してトップダウン方式でWebサービスをアセンブルしているか、JAX-RPCハンドラ・チェーンまたはプロバイダAPIを使用してカスタム・コードを記述している)場合、このシナリオが発生する可能性があります。
WSDLを編集して、スキーマ定義をワイヤ書式に一致させます。
この回避策は、サービスを所有していて、XMLスキーマ定義のオーサリングで誤った場合に、サーバー・サイドで使用できます。この方法は、サービス実装を所有していない(または変更できない)場合、クライアント・サイドでも使用できます。
dataBinding=falseを指定してWebサービスを生成し、Javaレイヤーに対してXMLを無効にします。すべてのスキーマ型が、SOAPElementとして表現されます。次にSAAJ APIを使用して、raw XML処理するカスタム・コードを記述します。
rpc-encoded書式とデータ・バインディングに対する制限
OracleAS Web Servicesは、rpc-encodedメッセージ書式とdatabinding=falseの組合せはサポートしていません。この組合せは業界内ではベスト・プラクティスとみなされていないためです。
document-encodedメッセージ書式が、OracleAS Web Servicesによってサポートされない
style="document"とuse="encoded"の組合せは、SOAP仕様では有効でも、OracleAS Web Servicesなど、主要なWebサービスのプラットフォームではサポートされていません。
document-literal bareメッセージ書式が1つの入力部分に限定されている
OracleAS Web Servicesでは、bareの場合の入力として1つの部分のみがサポートされています。その他の入力パラメータはすべてSOAPヘッダー部分にマップする必要があります。
BigDecimal値のシリアライズにより端数処理エラーが発生することがある
java.Math.BigDecimalで利用できるいくつかのコンストラクタがあります。これらのコンストラクタは、次の値タイプを入力として取れます。
倍精度浮動小数点
整数および桁移動子
10進数のString型表現
BigDecimal(double)コンストラクタを使用する際は十分注意してください。計算に端数処理エラーが入り込むことがあります。かわりに、intまたはStringベースのコンストラクタを使用してください。
たとえば、値123.45を取る次の文を考えてみます。
... double d = 1234.45; System.out.println(d); System.out.println(new BigDecimal(d)); ...
これらの文により次の出力が生成されます。第2の値は予期した値ではありません。
1234.45 1234.450000000000045474735088646411895751953125
getChildNodeではなくgetFirstChildとgetNextSiblingを使用して、NodeListsを取得する
node.getChildNodeを使用して取得したNodeListに対して反復処理を行うと、パフォーマンスが低下する場合があります。NodeListが非常に長い場合にのみ、著しく低下します。
node.getChildNodeで取得したNodeListを使用するかわりに、現行のOracle XDK実装では、node.getFirstChildを使用し、node.getNextSiblingでループすることにより、子ノードのリストのナビゲートに対する最適化を提供しています。次に、この方法のコードのサンプルを示します。
Node n = ...;
if (n.hasChildNodes()) {
for(Node nd=n.getFirstChild(); nd!=null; nd=nd.getNextSibling()){
nd.getValue(); // do something with nd
}
}
document-literalメッセージ書式を使用するWebサービスをトップダウン方式でアセンブルしようとすると、WebServicesAssemblerにより、同じ入力メッセージを使用する操作がWSDLで2つ以上検出された場合、警告が戻されます。OC4Jランタイムが、どのメソッドを起動するのかを識別できなくなるためです。
たとえば、次のWSDLフラグメントではWebServicesAssemblerにより警告が戻されます。このフラグメントでは、addRelationshipおよびaddRelationship3の操作が定義されています。これらの各操作でaddRelationshipRequest入力メッセージが使用されています。
... <operation name="addRelationship"> <input name="addRelationship1Request" message="tns:addRelationship1Request"/> <output name="addRelationship1Response" message="tns:addRelationship1Response"/> </operation> <operation name="addRelationship3"> <input name="addRelationship1Request" message="tns:addRelationship1Request"/> <output name="addRelationship1Response" message="tns:addRelationship1Response"/> </operation> ...
クライアントからaddRelationship操作を起動する場合は、実装クラス内で操作が使用される順序に応じて、addRelationshipまたはaddRelationship3が起動されます。
次のいずれかのスキーマ機能をWSDLで処理すると、それらはSOAPElementにマッピングされます。
複数のxsd:any要素のあるモデル・グループ
xsd:choice要素
混合コンテンツ
置換グループ
複数のxsd:any属性のある型
トップダウン方式でWebサービスをアセンブル、またはWebサービス・プロキシをアセンブルする場合、WebServicesAssemblerはxsd:choiceまたはxsd:groupXML型を含むWSDLを使用できません。これらのXML型を含むWSDLを使用する場合は、WebServicesAssemblerのdataBinding引数をfalseに設定し、ペイロードがWSDLファイルのスキーマ定義に準拠するようにSOAPElementをコーディングします。
ステートフルWebサービスに対する制限事項
OracleAS Web Servicesにより、ステートフルWebサービスは、Javaクラスをベースにしたサービスに対してのみサポートされます。これらのサービスは、Oracle独自の拡張機能を含んでおり、同じセマンティクスを持つスコープを用意したサービス・プロバイダとのみ相互運用可能ですので、注意してください。
OracleAS Web ServicesによるステートフルWebサービスのサポートは、HTTPをベースにしています。ステートフルWebサービスは、SOAP/HTTPエンドポイントに対してのみ機能し、SOAP/JMSエンドポイントに対しては機能しません。
JavaクラスからのWebサービスのアセンブル: リリース10.1.3.1と10.1.2の相違点
Oracle Webサービスのリリース10.1.2(およびそれ以前)とリリース10.1.3.1には次のような相違点があります。
リリース10.1.2では、RemoteInterfaceの機能拡張やメソッドによるRemoteExceptionのスローは必要ありませんでした。リリース10.1.3.1では、J2SE 5.0 Webサービス注釈機能を使用しないかぎりは、これが必要です。
リリース10.1.2では、インタフェースを提供しなくても単独でクラスを公開できました。リリース10.1.3.1では、J2SE 5.0 Webサービス注釈機能を使用しないかぎりは、インタフェースを提供してクラスを公開する必要があります。
EJBに対するトランザクション境界(デマーケーション)の設定
Webサービスとして公開するEJBでは、そのトランザクション境界(デマーケーション)としてTX_REQUIREDまたはTX_MANDATORYを設定しないでください。
JMSエンドポイントWebサービスの場合、OracleAS Web Servicesでは、JMSメッセージのペイロードとして、java.lang.Stringまたはjavax.xml.soap.SOAPElementのインスタンスのみがサポートされています。
SOAPメッセージ・ヘッダーのJMSプロパティ
SOAPヘッダーによって送信できるJMSプロパティ数はごく限られています。genJmsPropertyHeader引数の値がtrueの場合(デフォルト)は、次のJMSプロパティをSOAPヘッダーによって送信できます。
データ型の制限
SQLタイプのSYS.ANYDATAはPL/SQL Webサービスではサポートされていません。
Oracle WebRowSetおよびXDB RowSetとして戻されるREF CURSORでは、その結果内で複合型はサポートされません。
JDBCでの制限のため、PL/SQLストアド・プロシージャでは、次のSQLタイプはOUTまたはINOUTパラメータとしてサポートされていません。
char型(char、character、ncharなど)
long型(long、long rawなど)
10.1.3.1とそれより前のリリースの間でのデータベースWebサービスの相違点
リリース9.0.4または10.1.2で生成されたデータベースWebサービス用に記述されたWebサービス・クライアントは、リリース10.1.3.1でボトムアップ方式で生成されたデータベースWebサービスで使用しようとすると、失敗します。PL/SQLの構造に変更がなくても同様です。
この理由の1つは、SQLコレクション型がリリース9.0.4および10.1.2では単一の配列プロパティを持つ複合型にマップされていたためです。リリース10.1.3.1では、かわりに配列に直接マップされます。
Webサービス・クライアントを再生成する場合は、クライアント・コードを記述しなおす必要があります。これは、再生成されるコードでは現在、BeanWrappingArrayではなくarray[]が使用されるためです。
サポートされていないWebサービス・メタデータ機能
Web Services Metadata for the Java Platform仕様には、OracleAS Web Servicesでサポートされていない部分があります。たとえば、Java Architecture for XML Binding(JAXB)仕様の2.2.2および2.2.3項で定義されている「Start With WSDL」モードおよび「Start With WSDL and Java」モードは、OracleAS Web Servicesではサポートされていません。OracleAS Web Servicesでサポートされているのは「Start With Java」モードのみです。
WebServicesAssemblerコマンドのassembleまたはgenWsdlを使用して、J2SE 5.0 Webサービス注釈準拠の注釈を付けて使用するWSDLを生成する場合、これらのコマンドは、注釈を含まないファイルの処理での使用時とは別の方法で指定する必要があります。
|
関連資料: これらのコマンドを使用してJ2SE 5.0 Webサービス注釈準拠の注釈を付けて使用するWSDLを生成する方法の詳細は、『Oracle Application Server Web Services開発者ガイド』の「WebServicesAssemblerの使用方法」の章の「assemble」および「genWsdl」を参照してください。 |
注釈付きクラスをWebServicesAssemblerアセンブル・コマンドのclasspath引数にリストする必要がある
WebServicesAssemblerのassembleコマンドを使用して注釈付きクラスをWebサービスにアセンブルする場合、クラスをinput引数およびclasspath引数の両方に指定する必要があります。input引数にリストされるファイルは注釈付ではないクラスのクラスパスの部分とされるため、classpathは必要ではありません。
REST Webサービスのサポートに関する制限事項
次のリストは、OracleAS Web ServicesによるREST Webサービスのサポートにおける制限事項です。
RESTは、literal操作(リクエストとレスポンスの両方がリテラル)のWebサービス・アプリケーションに対してのみサポートされます。
HTTP GETは、(必須の)複合パラメータのないWebサービス操作に対してのみサポートされます。
ブラウザによっては、HTTP GET URLのサイズを、通常、2000文字以下に制限している場合があります。パラメータ数を制限し、パラメータの値および名前を短くすることで、URLサイズを小さくするように注意してください。
REST Webサービスでは、簡易XMLメッセージのみが送信されます。添付ファイル付きメッセージは送信できません。
セキュリティや信頼性など、管理機能の多くは、REST Webサービスでは利用できません。これは、通常この情報の保持に使用するSOAPヘッダーが、サービスのREST起動では使用できないためです。
REST起動は、生成されたスタブまたはDIIクライアントから行うことはできません。それらのクライアントからの起動はSOAPで行われます。
プロバイダのフレームワークでは、RESTはサポートされません。
RESTでの操作名には、マルチバイト・キャラクタは使用できません。
Webサービス・テスト・ページには、次の制限事項があります。
Webサービス・テスト・ページでは、WS-Securityに対して基本サポートのみが提供されます。エディタでは、SOAPエンベロープにユーザー名とパスワードのみを入力できます。暗号化や署名など、その他の複雑なまたは拡張されたWS-Security機能を使用するには、SOAPリクエストを起動ページで直接編集する必要があります。
Webサービス・テスト・ページでは、添付ファイルをアップロードできません。
テスト・ページを使用してWSIFサービスを起動することはできません。
独自の拡張機能が含まれるWSDLファイルは、Webサービス・テスト・ページでは正常に動作しません。たとえば、JMSをトランスポートとして使用するサービスは、テスト・ページを使用してテストできません。
クライアント・アプリケーションとスレッド使用量
クライアント・アプリケーションが処理(たとえば、別個のスレッドを使用する非同期コールを有効にする場合)用に独自のスレッドを作成する場合、アプリケーション・サーバーを-userThreadsオプションで起動する必要があります。
java -jar oc4j.jar -userThreads
-userThreadsオプションを使用すると、ユーザー作成スレッドからのコンテキストのルックアップとクラスのロードができるようになります。
WebServicesAssemblerでは、JAX-RPCメッセージ・ハンドラを構成するためのAntタスクが提供されます。ハンドラは、WebServicesAssemblerコマンドラインを使用して構成することはできません。
強い型指定とServiceLifecycleインタフェース
ServiceLifecycleインタフェースを使用すると、WSDLファイルに宣言されていない可能性のあるSOAPヘッダー・ブロックにアクセスできますが、ブロックには強い型指定が行われません。SOAPヘッダーのXML構造を処理するには、その理解も必要です。SOAPヘッダー・ブロックに対して強い型指定を行うには、WebServicesAssemblerのmapHeadersToParameters引数をtrueに設定するようにしてください(trueがデフォルト値です)。これが可能なのは、SOAPヘッダーがWSDLファイルに宣言されており、SOAPヘッダーのタイプがJAX-RPCでサポートされているタイプの場合のみです。
現行のツール・セットではJ2EE Webサービス・クライアントをパッケージできません。クライアントは手動でパッケージ化する必要があります。
|
関連資料: J2EE Webサービス・クライアントのパッケージ化方法の詳細は、『Oracle Application Server Web Services開発者ガイド』の「J2EEクライアントのパッケージ化」を参照してください。 |
WSDLに複数のHTTPポートがある場合の、正しいエンドポイント・アドレスの取得
oracle-webservices.xmlの<web-site>または<wsdl-publish-location>要素に値を入力する場合、戻されたWSDLに複数のHTTPポートがあるときは、そのWSDLには正しいエンドポイント・アドレスが含まれていない可能性があります。
WebServicesAssemblerツールでは、作成するoracle-webservices.xmlファイルには、<web-site>または<wsdl-publish-location>要素を挿入しません。これらの要素は手動で挿入する必要があります。
生成されたクライアントおよびサービス・クラスが同じEARファイルに表示されると、OWS-04005エラーが戻される
クライアントおよびWebサービス・クラスを同じディレクトリに生成すると、WebServicesAssemblerがクライアント・クラスをWebサービスEARファイルにパッケージする場合があります。EARファイルをサーバーにデプロイする場合、OracleAS Web ServicesのOWS-04005エラーでデプロイに失敗します。
OWS-04005 ポートでエラーが発生しました: ...
たとえば、Application Server Controlを使用して、生成されたクライアント・クラスを含むEARファイルをデプロイすると、次に示すエラーと同様のエラーを戻す可能性があります。
ERROR OWS-04005 An error occurred for port: {http://ws.myservice.org/}HttpSoap11: no serializer is registered
for (class org.myservice.ws.MyWebService_sayHello_ResponseStruct, {http://ws.myservice.org/}sayHelloResponse)
このサービスをWebサービス・テスト・ページで起動する場合、ページは診断メッセージで応答します。たとえば、次に示すメッセージと同様の応答メッセージがテスト・ページに表示されます。
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header/>
<env:Body>
<env:Fault
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<faultcode>env:Server</faultcode>
<faultstring>no serializer is registered for (class org.rajkovic.ws.MyWebService_sayHello_ResponseStruct,
{http://ws.myService.org/}sayHelloResponse)</faultstring>
<faultactor/>
</env:Fault>
</env:Body>
</env:Envelope>
この問題を回避するには、使用するクライアントおよびWebサービス・クラスを別々のディレクトリに生成します。
WebServicesAssemblerによって生成される名前の先行アンダースコア
WebServicesAssemblerツールのデフォルト動作は、Javaパッケージ名から名前空間を生成することです。Javaパッケージ名が先行アンダースコア(「_」)で始まる場合は、生成される名前空間のURIにはアンダースコアが含まれます。.NET WSDLツールの一部のバージョンでは、生成された名前空間が有効であっても、それらの名前空間を消費できないことがあります。
この.NETの問題を回避するには、WebServicesAssemblerの引数targetNamespaceまたはmappingFileName(あるいはその両方)を使用して、デフォルトでパッケージによって導出される名前空間を回避します。
AXISプラットフォームで「0」をURI応答の値にデシリアライズできない
JAX-RPC仕様によると、xsd:anyURI型は、J2SE 1.4以降での実行を前提とするアプリケーションでjava.net.URIクラスにマッピングする必要があります。1.4より前の環境との互換性のため、JAX-RPC実装では、この型をjava.lang.Stringにマッピングできます。
ただし、AXISプラットフォームでは、xsd:anyURIは独自クラスorg.apache.axis.types.URIにマッピングされます。このため、「0」を渡して新しいURIを初期化すると、問題が発生します。
たとえば、AXISプラットフォームで値「0」を次のコードのサンプルで使用する場合、URIパーサーはポートに「0」を割り当て、インスタンス化のためにコンストラクタをコールします。
java.net.URIret = new java.net.URI("0"); // <wsdl:part
name="inUri" type="xsd:anyURI"/>
return ret;
この状況が、AXISプラットフォームのsetPortメソッドが次に示すようなエラーをスローする原因になります。
org.apache.axis.types.URI$MalformedURIException: Port cannot be set when host is null!
これを回避するには、AXISプラットフォームでxsd:anyURIではなくxsd:stringを使用します。
.NETクライアントで、OracleAS Web Servicesからのマルチディメンションsoapenc:arrayレスポンスをデシリアライズできない
.NETクライアントでは、マルチディメンションのSOAP-encoded配列(soapenc:array)は配列の配列として正しく表現されません。このクライアントは、soapenc:arrayを含むOracleAS Web Servicesからレスポンスを受け取ると、次のようなエラーを戻します。
Unhandled Exception: System.InvalidOperationException: There is an error in XML document (2, 713). ---> System.ArgumentException: SOAP-ENC:arrayType with multdimensional array found at <ArrayOfArrayOf_xsd_anyType xmlns='http://tips.cf'>.
.NETクライアントのこの制限を回避するには、.NETとの相互運用性が必要な場合、マルチディメンションのsoapenc:arrayを使用しないようにします。かわりに、配列を単次元のみで使用、または配列の配列を使用します。
swaRef添付ファイルによるフォルトのWebサービスへの追加
OracleAS Web Servicesでは、SOAP障害メッセージに追加できるのはswaRef MIMEタイプ添付ファイルのみです。SWAタイプ添付ファイルの追加はサポートされていません。
添付ファイル付きの障害をWebサービスに追加できるのは、WebサービスをWSDLから(トップダウン方式で)アセンブルする場合にのみです。Webサービスをボトムアップ方式でアセンブルする場合は追加できません。
添付ファイル用にサポートされているメッセージ書式
rpc-literalおよびdocument-literalのWebサービスのみが、WS-I Attachments Profile 1.0によってサポートされています。したがって、これらのタイプのサービスのみがswaRef MIMEタイプを使用できます。
rpc-encodedメッセージ書式を指定すると、WebServicesAssemblerでは、swaRef MIME添付ファイルを渡せるWebサービスをアセンブルできなくなります。このようなサービスをアセンブルするには、別の書式を選択する必要があります。
Application Server Controlに関する制限事項
Application Server Controlでは、wsmgmt.xmlファイルに指定可能な内容をすべて変更できるわけではありません。たとえば、信頼性の構成に関する部分は変更できません。
OracleAS Web Servicesの信頼性に関する制限事項
クライアント上の信頼性プロセスは、クライアント・プロセスと同じ期間有効です。クライアント・プロセスが永久的に無効になると、再試行する必要があるメッセージがすべて無視されます。
非同期ポーリング機能は、ポート・レベルでのみ、および構成によってのみ有効にできます。
xpath問合せに関する制限事項
xpath問合せではプリミティブ型を戻す必要があります。つまり、この問合せではテキスト・ノードまたはまたは属性値のコンテキストを戻す必要があります。
xpath問合せによって戻されるプリミティブ型には、少ない文字数を設定する必要があります。たとえば、120文字を超えないようにします。
この項では、標準外のデータ型のカスタム・シリアライズに関する制限事項について説明します。
use="literal"
このリリースでは、メッセージ書式のuse部分としては、literalのみがサポートされています。literalには、rpc-literalとdocument-literalがあります。このリリースでは、rpc-encodedはサポートされていません。
オブジェクト・グラフ
このリリースではrpc-encodedがサポートされていないため、シリアライズおよびデシリアライズのこの初期サポートでは、hrefを使用したオブジェクト・グラフのマーシャリングはできません。Javaオブジェクトがリクエストのパラメータまたはレスポンスの戻り値の中に複数の参照を持つ場合は、シリアライズおよびデシリアライズを行うと、オブジェクト・グラフが保持されなくなる可能性があります。
WSDLレベルおよびサービス・レベルでの構成
SoapElementSerializerは、サービスまたはWSDLごとに構成します。たとえば、dateTimeとoracle.sql.DATE間のマッピングを表すSoapElementSerializer実装は、dateTimeとjava.util.Calendar間のデフォルト・マッピングに取って代わるように構成できます。この構成では、マッピングのすべてのインスタンスが置換されます。各操作レベルまたは各メッセージ・レベルでの構成は、このリリースではサポートされていません。
サブツリーのシリアライズ
各カスタム・シリアライザではXMLサブツリー全体を取得し、XML要素オブジェクト・モデル全体のシリアライズおよびデシリアライズを実行します。たとえば、2つのトップレベルcomplexTypes用に開発および構成された2つのカスタム・シリアライザTypeAおよびTypeBがあるとします。TypeAには、TypeBサブ要素があります。カスタム・シリアライザがTypeB用に構成されているが、TypeBサブ要素がTypeAのカスタム・シリアライザ内でシリアライズされる場合は、OC4JランタイムはTypeBのカスタム・シリアライザを自動的には起動することができません。TypeAのカスタム・シリアライザが、TypeBサブ要素も処理する必要があります。TypeAのカスタム・シリアライザからTypeBのカスタム・シリアライザをコールすることは可能ですが、これは実装計画次第です。
document-literalラッパー
カスタム・シリアライザを使用してグローバルcomplexTypeを処理するとします。この型はグローバル要素によって参照され、document-literal操作の単一部分を定義します。unwrapParameters引数を使用して戻り型とレスポンス・タイプをアンラップする場合は、前述のグローバル型は、入力メッセージのボディ部分としてグローバル要素を使用する操作で無視されます。
トランスポート・メカニズムとしてJMSを使用する場合のメッセージの相互運用性
トランスポート・メカニズムとしてJMSを有効にするWSDL拡張機能は、Oracle独自のものです。このWebサービスによって生成されるメッセージは、他のベンダーによって提供されるアプリケーションまたはサービスと相互運用できないことがあります。
JMS Webサービス・トランスポートからのクライアント・レスポンスの取得
クライアント・プロセスがレスポンスや後続の戻り値を受け取ることなく無効になった場合に、クライアント・プロセスがその古いレスポンスをキューから取得する機能は用意されていません。
JMSプロパティの変更
Webサービスのデプロイ後に、使用するJMSバインディングのプロパティを変更する場合、WSDLドキュメントを手動で編集し、JMSアドレス(<jms:address>)およびJMSプロパティ要素(<jms:propertyValue>)に正しい値を入力する必要があります。WSDLドキュメントを編集した後に、サービスを再デプロイします。
問題を解決するために、JMS値をoracle-webservices.xmlファイルで編集しないでください。このファイルのJMSの部分は、サービスを再デプロイする際に再ロードされません。oracle-webservices.xmlファイルを使用して問題を解決する場合は、WebServicesAssemblerを使用してサービスを再生成してください。
|
関連資料: JMSアドレスおよびJMSプロパティ値のWSDL要素の詳細は、『Oracle Application Server Web Servicesアドバンスト開発者ガイド』の「JMSトランスポートのWSDL拡張」を参照してください。 |
この項では、OracleAS Web ServicesによるWebサービス起動フレームワーク(WSIF)のサポートに関する制限事項について説明します。
データベースWSIFでは、データベース・アクセスのためプロバイダに渡せるのは、データソースのみでJDBC接続ではありません。
データベースWSIFはステートレスです。各操作は、開始時にJDBC接続を取得し、終了時にJDBC接続を閉じます。自動コミットは、JDBC接続では常に有効になっています。データベース・オーバーヘッドが削減されるようにデータソースを設定する場合は、接続プーリングを使用することをお薦めします。
Oracle Application Server ControlのWebサービスの管理および監視では、SOAPサービスが直接監視できるのみです。Java、EJB、データベースWSIFバインディングなどのWSIFバインディングを活用するサービスとの対話は監視できません。SOAPプロトコルを完全にバイパスすることで、Oracle Application Server Controlによって提供されるWebサービス管理インフラストラクチャもバイパスされます。