Oracle Application Server Web Services開発者ガイド 10g(10.1.3.1.0) B31868-01 |
|
この付録では、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配列を表現します。
次の例は、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サービスを公開しようとするとエラーが発生します。たとえば、入力または戻り引数として多次元配列を取るメソッドがあるJavaクラスを公開しようとすると、エラーが戻されることがあります。
この問題の解決策としては次の2つが考えられます。
配列の次元ごとのJavaBeanの作成: 配列の各次元をJava値タイプにラップして制限を回避できます。
次の例では、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 Servicesがスキーマ検証の実行を試みると発生する場合があります。エラーの原因は、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).
このエラーを回避する方法は次のとおりです。
この方法は、サービスの実装を変更でき、トップダウン方式によるWebサービスのアセンブルのシナリオで作業している場合にのみ使用できます。スキーマ定義とSOAPペイロードの不一致は、規約を実装するときにレスポンスの書式設定を誤ったことが原因である可能性があります。SAAJ APIを使用している場合、つまりdataBinding=false
を指定してWebサービスをトップダウン方式でアセンブルしているか、JAX-RPCハンドラ・チェーンまたはプロバイダAPIを使用してカスタム・コードを作成している場合に、このシナリオが発生する可能性があります。
サービスを所有していて、XMLスキーマ定義のオーサリングで誤った場合は、サーバー・サイドでこの回避策を実施できます。サービスの実装を所有していない場合、または変更できない場合は、クライアント・サイドでこの方法を実施することもできます。
dataBinding=false
を指定してWebサービスを生成し、Javaレイヤーに対してXMLを無効にします。すべてのスキーマ型は、SOAPElement
として表されます。その後、SAAJ APIを使用してRAW XMLを処理するカスタム・コードを作成します。
OracleAS Web Servicesは、rpc-encodedメッセージ書式とdatabinding=false
の組合せはサポートしていません。この組合せは業界内ではベスト・プラクティスとみなされていないためです。
style="document"
とuse="encoded"
の組合せは、SOAP仕様では有効でも、OracleAS Web Servicesなど、主要なWebサービスのプラットフォームではサポートされていません。
OracleAS Web Servicesでは、bareの場合の入力として1つの部分のみがサポートされています。その他の入力パラメータはすべてSOAPヘッダー部分にマップする必要があります。
java.Math.BigDecimal
で利用できるいくつかのコンストラクタがあります。これらのコンストラクタは、次の値タイプを入力として取れます。
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
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
にマップされます。
Webサービスをトップダウン方式でアセンブルする場合、またはWebサービス・プロキシをアセンブルする場合には、WebServicesAssemblerは、xsd:choice
またはxsd:group
のXML型を含むWSDLを使用できません。これらのXML型を含むWSDLを使用する場合は、WebServicesAssemblerのdataBinding
引数をfalse
に設定し、WSDLファイルでのスキーマ定義にペイロードが準拠するようにSOAPElement
をコーディングする必要があります。
スキーマがrpc-encodedメッセージ書式とのバインディングを含む場合、WebServicesAssemblerは、属性でcomplexTypeを検出すると、サポートされない型が検出されたことを示すエラー・メッセージをスローします。
OracleAS Web Servicesにより、ステートフルWebサービスは、Javaクラスをベースにしたサービスに対してのみサポートされます。これらのサービスは、Oracle独自の拡張機能を含んでおり、同じセマンティクスを持つスコープを用意したサービス・プロバイダとのみ相互運用可能ですので、注意してください。
OracleAS Web ServicesによるステートフルWebサービスのサポートは、HTTPをベースにしています。ステートフルWebサービスは、SOAP/HTTPエンドポイントに対してのみ機能し、SOAP/JMSエンドポイントに対しては機能しません。
Oracle Webサービスのリリース10.1.2(およびそれ以前)とリリース10.1.3.1には次のような相違点があります。
RemoteInterface
の機能拡張やメソッドによるRemoteException
のスローは必要ありませんでした。リリース10.1.3.1では、J2SE 5.0 Webサービスの注釈機能を使用していない場合には、これが必要になります。
Webサービスとして公開するEJBでは、そのトランザクション境界(デマーケーション)としてTX_REQUIRED
またはTX_MANDATORY
を設定しないでください。
JMSエンドポイントWebサービスの場合、OracleAS Web Servicesでは、JMSメッセージのペイロードとして、java.lang.String
またはjavax.xml.soap.SOAPElement
のインスタンスのみがサポートされています。
SOAPヘッダーによって送信できるJMSプロパティ数はごく限られています。genJmsPropertyHeader
引数の値がtrue
の場合(デフォルト)は、次のJMSプロパティをSOAPヘッダーによって送信できます。
SYS.ANYDATA
はPL/SQL Webサービスではサポートされていません。
REF CURSOR
はPL/SQL Webサービスではサポートされていません。
WebRowSet
およびXDB
RowSet
として戻されるREF CURSOR
では、その結果内で複合型はサポートされません。
OUT
またはINOUT
パラメータとしてサポートされていません。
リリース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 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を生成する場合、これらのコマンドは、注釈を含まないファイルの処理での使用時とは別の方法で指定する必要があります。
WebServicesAssemblerのassemble
コマンドを使用して、注釈付きのクラスをWebサービスにアセンブルする場合は、input
引数とclasspath
引数の両方でクラスを指定する必要があります。注釈付きでないクラスの場合はinput
引数でリストされているファイルはclasspathの一部であるとみなされるので、classpath
は本来は必要ありません。
次のリストは、OracleAS Web ServicesによるREST Webサービスのサポートにおける制限事項です。
Webサービスのテスト・ページには、次の制限事項があります。
クライアント・アプリケーションが処理(たとえば、別個のスレッドを使用する非同期コールを有効にする場合)用に独自のスレッドを作成する場合、アプリケーション・サーバーを-userThreads
オプションで起動する必要があります。
java -jar oc4j.jar -userThreads
-userThreads
オプションを使用すると、ユーザー作成スレッドからのコンテキストのルックアップとクラスのロードができるようになります。
WebServicesAssemblerでは、JAX-RPCメッセージ・ハンドラを構成するためのAntタスクが提供されます。ハンドラは、WebServicesAssemblerコマンドラインを使用して構成することはできません。
ServiceLifecycle
インタフェースを使用すると、WSDLファイルに宣言されていない可能性のあるSOAPヘッダー・ブロックにアクセスできますが、ブロックには強い型指定が行われません。SOAPヘッダーのXML構造を処理するには、その理解も必要です。SOAPヘッダー・ブロックに対して強い型指定を行うには、WebServicesAssemblerのmapHeadersToParameters
引数をtrue
に設定するようにしてください(true
がデフォルト値です)。これが可能なのは、SOAPヘッダーがWSDLファイルに宣言されており、SOAPヘッダーのタイプがJAX-RPCでサポートされているタイプの場合のみです。
生成されたファイル名とディレクトリ名を組み合せた長さが一定のサイズ制限を超える場合は、デプロイが失敗し、エラーがスローされます。サイズ制限はオペレーティング・システムに応じて異なります。たとえば、Windowsオペレーティング・システムではサイズ制限は255文字です。
名前の長さは、WebServicesAssemblerとデプロイ・コードで制御されます。ファイル名は、WebServicesAssemblerにより、Javaクラスのメソッド名またはWSDLの操作名に基づいて生成されます。ディレクトリは、デプロイ・コードにより、コード生成時にEARおよびWARファイルの名前に基づいて作成されます。
生成されるファイル名およびディレクトリ名が長くならないようにするには、次の名前の文字数を妥当な長さに制限します。
また、J2SE 5.0 JDKの最新バージョン(jdk-1_5_0_06以降)にアップグレードすることによっても、この問題を回避できます。
コマンドラインまたはAntタスクにdebug
引数を指定することで、WebServicesAssemblerによって戻されるエラーに関する詳細な診断情報を取得できます。
WebServicesAssemblerでファイルを正常にコンパイルできないと、次のようなエラーが戻されます。
java? java.io.IOException: CreateProcess: javac -encoding UTF-8 -classpath
WebServicesAssemblerでJavaファイルがコンパイルできるよう、javac
コンパイラを利用できるようにする必要があります。パスにはJAVA_HOME
/bin
を含めるようにしてください。
すべてのJ2EE 1.4アプリケーションに共通するクラスの使用が必要な場合もあります。標準J2EE 1.4クラスおよびOracleデータベース・クラスはすべて自動的に組み込まれます。Antタスクの使用時に、WebServicesAssemblerでは、これらのクラスが含まれたJARを検索する必要があります。
WebServicesAssembler Antタスクでは、wsa.jar
を検索してこれらの補足的なクラスをロードしようとします。Antタスクでは、次のAntプロパティまたは環境変数をこの順序で検索します。タスクによってwsa.jar
が見つからないか、プロパティが定義されていない場合は、タスクは次のプロパティを検索します。
oc4j.home
: OC4Jのルート・インストール・ディレクトリが指定されているAntプロパティ。このプロパティは、環境変数のかわりに使用できます。
OC4J_HOME
: OC4Jのルート・インストール・ディレクトリが指定されている環境変数。
oracle.home
: Oracle製品のルート・インストール・ディレクトリが指定されているAntプロパティ。このプロパティは、環境変数のかわりに使用できます。
ORACLE_HOME
: Oracle製品のルート・インストール・ディレクトリが指定されている環境変数。
Antタスクは、wsa.jar
を検出すると、wsa.jar
の位置をルートとして、そのマニフェスト・ファイルにリストされているすべてのクラスをロードします。
意図的にWebサービスとメッセージ部分を異なるディレクトリに生成することができ、また同じことが非意図的に発生する場合もあります。そのための方法の1つは、targetNamespace
引数を誤って設定することです。
targetNamespace
の値は、仕様に準拠しているHTTP URL、準拠していないHTTP URL、またはURIであってもかまいません。targetNamespace
の値は、次のようにしてパッケージ名にマップされます。
http://hello.demo.oracle.com
というターゲット名前空間は、パッケージ名com.oracle.demo.hello
にマップします。
http://hello.demo.oracle
というターゲット名前空間は、パッケージ名hello.demo.oracle
にマップします。
_
)で区切られた単一の識別子にマップされます。次に例を示します。urn:oracle.demo.hello
というターゲット名前空間は、識別子oracle_demo_hello
にマップします。
たとえば、パッケージ・パスoracle/demo/hello
でWebサービスをアセンブルしているものとします。targetNamespace
引数にhttp://hello.demo.oracle
(非準拠URL)を設定すると、WSDLのターゲット名前空間はhttp://hello.demo.oracle
になりますが、メッセージ部分はまだ名前空間oracle.demo.hello
(サービス・パッケージ名から)を使用しています。このWSDLでプロキシを生成すると、サービスはhello.demo.oracle
に生成され、メッセージ部分はoracle.demo.hello
に生成されます。
この場合は、targetNamespace
引数の値としてhttp://oracle.demo.hello
を使用する必要があります。それにかわる方法としては、Javaコードがcom/oracle/demo/hello
にある場合は、targetNamespace
引数の値としてhttp://hello.demo.oracle.com
を使用します。このようにすると、生成されるコードは意図したJavaパッケージに格納されます。
WSDLファイルの要素名でマルチバイト・キャラクタが使用されている場合、genInterface
、genProxyおよびtopDownAssembleコマンドはWSDLファイルを正しく処理できません。コマンドはJavaソース・ファイルを生成しますが、このソース・ファイルをコンパイルすることはできません。
この制限事項を回避するには、インタフェースを生成するときに、dataBinding
引数にfalse
を設定します。
現行のツール・セットではJ2EE Webサービス・クライアントをパッケージできません。手動でクライアントをパッケージする必要があります。
oracle-webservices.xml
の<web-site>
または<wsdl-publish-location>
要素に値を入力する場合、戻されたWSDLに複数のHTTPポートがあるときは、そのWSDLには正しいエンドポイント・アドレスが含まれていない可能性があります。
WebServicesAssemblerツールでは、作成するoracle-webservices.xml
ファイルには、<web-site>
または<wsdl-publish-location>
要素を挿入しません。これらの要素は手動で挿入する必要があります。
クライアントと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ツールのデフォルト動作は、Javaパッケージ名から名前空間を生成することです。Javaパッケージ名が先行アンダースコア(「_」)で始まる場合は、生成される名前空間のURIにはアンダースコアが含まれます。.NET WSDLツールの一部のバージョンでは、生成された名前空間が有効であっても、それらの名前空間を消費できないことがあります。
この.NETの問題を回避するには、WebServicesAssemblerの引数targetNamespace
またはmappingFileName
(あるいはその両方)を使用して、デフォルトでパッケージによって導出される名前空間を回避します。
JAX-RPCの仕様によると、J2SE 1.4以降で実行するアプリケーションでは、xsd:anyURI
型はjava.net.URI
クラスにマップされる必要があります。1.4より前の環境との互換性のため、JAX-RPCの実装は、この型をjava.lang.String
にマップすることが許されています。
しかし、AXISプラットフォームは、xsd:anyURI
を独自のクラスorg.apache.axis.types.URI
にマップしています。このため、新しいURIをインスタンス化するために0を渡すと、問題が発生する場合があります。
たとえば、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クライアントは、多次元のSOAPエンコード配列(soapenc:array
)を、配列の配列として誤って表します。このようなクライアントが、OracleAS Web Servicesからsoapenc:array
を含むレスポンスを受け取ると、次のようなエラーを戻します。
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
を使用しないようにします。1次元の配列を使用するか、またはかわりに配列の配列を使用してください。
OracleAS Web Servicesでは、SOAPフォルト・メッセージに追加できるのはswaRef
MIMEタイプ添付ファイルのみです。SWA
タイプ添付ファイルの追加はサポートされていません。
添付ファイルによるフォルトは、WebサービスをWSDLから(トップダウン方式で)アセンブルする場合にのみ、Webサービスに追加できます。Webサービスをボトムアップ方式でアセンブルする場合は追加できません。
rpc-literalおよびdocument-literalのWebサービスのみが、WS-I Attachments Profile 1.0によってサポートされています。したがって、これらのタイプのサービスのみがswaRef
MIMEタイプを使用できます。
rpc-encodedメッセージ書式を指定すると、WebServicesAssemblerでは、swaRef
MIME添付ファイルを渡せるWebサービスをアセンブルできなくなります。このようなサービスをアセンブルするには、別の書式を選択する必要があります。
Application Server Controlでは、wsmgmt.xml
ファイルに指定可能な内容をすべて変更できるわけではありません。たとえば、信頼性の構成に関する部分は変更できません。
xpath
問合せではプリミティブ型を戻す必要があります。つまり、この問合せではテキスト・ノードまたはまたは属性値のコンテキストを戻す必要があります。
xpath
問合せによって戻されるプリミティブ型には、少ない文字数を設定する必要があります。たとえば、120文字を超えないようにします。
この項では、標準外のデータ型のカスタム・シリアライズに関する制限事項について説明します。
このリリースでは、メッセージ書式のuse
部分としては、literalのみがサポートされています。literalには、rpc-literalとdocument-literalがあります。このリリースでは、rpc-encodedはサポートされていません。
このリリースではrpc-encodedがサポートされていないため、シリアライズおよびデシリアライズのこの初期サポートでは、href
を使用したオブジェクト・グラフのマーシャリングはできません。Javaオブジェクトがリクエストのパラメータまたはレスポンスの戻り値の中に複数の参照を持つ場合は、シリアライズおよびデシリアライズを行うと、オブジェクト・グラフが保持されなくなる可能性があります。
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
のカスタム・シリアライザをコールすることは可能ですが、これは実装計画次第です。
カスタム・シリアライザを使用してグローバルcomplexType
を処理するとします。この型はグローバル要素によって参照され、document-literal操作の単一部分を定義します。unwrapParameters
引数を使用して戻り型とレスポンス・タイプをアンラップする場合は、前述のグローバル型は、入力メッセージのボディ部分としてグローバル要素を使用する操作で無視されます。
トランスポート・メカニズムとしてJMSを有効にするWSDL拡張機能は、Oracle独自のものです。このWebサービスによって生成されるメッセージは、他のベンダーによって提供されるアプリケーションまたはサービスと相互運用できないことがあります。
クライアント・プロセスがレスポンスや後続の戻り値を受け取ることなく無効になった場合に、クライアント・プロセスがその古いレスポンスをキューから取得する機能は用意されていません。
Webサービスをデプロイした後でJMSバインディングのプロパティを変更する必要がある場合は、WSDLドキュメントを手作業で編集し、JMSアドレス(<jms:address>
)要素とJMSプロパティ値(<jms:propertyValue>
)要素に正しい値を入力する必要があります。WSDLドキュメントを編集した後、サービスを再デプロイします。
oracle-webservices.xml
ファイルのJMS値を変更することで、問題を解決しないでください。このファイルのJMS部分は、サービスを再デプロイしてもリロードされません。oracle-webservices.xml
ファイルを使用してこの問題を解決する場合は、WebServicesAssemblerを使用してサービスを生成しなおす必要があります。
この項では、OracleAS Web ServicesによるWebサービス起動フレームワーク(WSIF)のサポートに関する制限事項について説明します。
動的プロバイダ・エンドポイントを使用していて、Application Server Controlの操作に対してMBeanが重複して発生する場合は、oracle-webvservices.xml
ファイルで、操作に対してinputName
属性とoutputName
属性が指定されていることを確認してください。
|
![]() Copyright © 2006 Oracle Corporation. All Rights Reserved. |
|