|
|
WebOTX Manual V11.1 (第6版) 目次を表示 |
ドメインディレクトリの config/server.policy に定義を追加し、権限を追加する必要があります。ドメインが停止した状態で、server.policy ファイルを開き、以下のコメンアウトを外してください。
// grant codeBase "jrt:/jdk.compiler" {
// permission java.lang.RuntimePermission "closeClassLoader";
// permission java.lang.RuntimePermission "createClassLoader";
// permission java.lang.RuntimePermission "getenv.JDK_JAVAC_OPTIONS";
// };
通常、JAX-RPCは配備時にTieクラスを生成処理(wscompile)を実行し、この生成したクラスを実行時に参照することで動作します。しかし、別環境で使用していたアプリケーションを移行する場合、すでにアプリケーション(WARファイル)にTieクラスが含まれている場合があります。その場合、V10以降の環境に配備する際に、さらに別のTieクラスが重複して生成されてしまい、この重複が原因でTieクラスの参照に失敗します。
対処としては、配備時のTieクラスの生成処理(wscompile)を抑制し、WARファイルにアーカイブされているTieクラスを明示的に参照する設定を追加します。具体的には以下の対応を行ってください。
<servlet>
<display-name>サーブレット表示名</display-name>
<servlet-name>サーブレット名</servlet-name>
<servlet-class>com.nec.webotx.enterprise.webservice.JAXRPCServlet</servlet-class> ※変更(固定値)
</servlet>
<servlet-mapping>
<servlet-name>サーブレット名</servlet-name>
<url-pattern>/URLパターン</url-pattern>
</servlet-mapping>
※以降は追加
<servlet-mapping>
<servlet-name>サーブレット名</servlet-name>
<url-pattern>/URLパターン/__container$publishing$subctx/*</url-pattern> ※"__container"以降は固定値
</servlet-mapping>
<context-root>/コンテキストルート</context-root>
<servlet>
<servlet-name>サーブレット名</servlet-name>
<webservice-endpoint>
<port-component-name>ポートコンポーネント名</port-component-name>
<endpoint-address-uri>/エンドポイントアドレスURI</endpoint-address-uri>
<service-qname>
<namespaceURI>ネームスペースURI</namespaceURI>
<localpart>ローカルパート</localpart>
</service-qname>
<tie-class>アプリケーションに含まれるTieクラス(パッケージ含む)</tie-class>
<servlet-impl-class>サーブレット実装クラス(パッケージ含む)</servlet-impl-class>
</webservice-endpoint>
</servlet>
<class-loader delegate="xxx"/>
JAX-WSはJAX-RPCの後継仕様ですが、Java-XMLバインディングにJAXBを利用しているため、一部互換性がありません。クライアントアプリケーションを作成する際には以下の注意が必要です。
<javaType name="java.util.Calendar" xmlType="xs:dateTime" parseMethod="javax.xml.bind.DatatypeConverter.parseDate" printMethod="javax.xml.bind.DatatypeConverter.printDate"/>
javax.xml.ws.Dispatchインタフェースを使用し、 WSDLのschemaの定義でメッセージの型に次のいずれかを指定した場合、 その型の上限値や下限値を超える値の指定が可能ですが受信側では問題を検出することはできません。 この場合、アプリケーションの引数や戻り値は、不正な値に変換されてしまいます。 そのため送信側で事前にチェックが必要です。
wsimportコマンドはWSDLへのアクセスを行う際に、 デフォルトでシステムのプロキシ設定を使用します。 システムのプロキシ設定の内容やネットワーク環境により、WSDLへのアクセスに失敗する場合があります。 この場合、{WebOTXインストールフォルダ}\bin\wsimport.bat を編集し、「%JAVA_CMD%」で始まる行について、wsimport実行時のシステムプロパティに以下の設定を追加してください。
-Dcom.nec.webotx.webservice.tools.ws.Invoker.noSystemProxies=true
JDK 11 以降で、クライアントアプリケーション(Javaアプリケーション)を実行した場合、次のような、リフレクションに関する警告メッセージが出力されます。動作には影響しませんが、この警告を抑止するには、Javaコマンドの引数に、--add-opens java.base/java.lang=ALL-UNNAMED を追加してください。
WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by com.sun.xml.bind.v2.runtime.reflect.opt.Injector (file:/opt/WebOTX/modules/wows-rt.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int) WARNING: Please consider reporting this to the maintainers of com.sun.xml.bind.v2.runtime.reflect.opt.Injector WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release
JAX-WSでは、encoded形式のSOAPメッセージをサポートしていません。literal形式のSOAPメッセージを利用してください。
例) WSDLで指定する場合
<operation name="someOperation"> <soap:operation soapAction="" /> <input> <soap:body use="literal" /> </input> <output> <soap:body use="literal" /> </output> <fault name="someOperationFault"> <soap:fault name="someOperationFault" use="literal" /> </fault> </operation>
例) プログラムで指定する場合
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
@SOAPBinding(use=SOAPBinding.Use.LITERAL)
@WebService
public class ServerImpl {
:
}
javax.xml.ws.Dispatchインタフェースを利用して動的呼び出しを行う場合に、JAXBContextクラスを利用したMESSAGEモードでの呼び出しはサポートしていません。利用する場合は、PAYLOADモードを指定してください。
例) プログラムで指定する場合
Service service = ・・・; QName qname = ・・・; JAXBContext context = ・・・; Dispatch dispatch = service.createDispatch(qname, context, Service.Mode.PAYLOAD);
javax.xml.ws.Dispatchインタフェースを利用して非同期通信を行う場合に、ハンドラのhandleMessage()およびhandleFault()の戻り値でfalseを返却する場合の動作はサポートしていません。必ずtrueを返却するようにハンドラを実装してください。
例) ハンドラの実装例
public class SomeHandler implements SOAPHandler <SOAPMessageContext> {
public boolean handleMessage(SOAPMessageContext context) {
:
:
return true; // 非同期通信で呼ばれるハンドラは必ずtrueを返すようにします
}
public boolean handleFault(SOAPMessageContext context) {
:
:
return true; // 非同期通信で呼ばれるハンドラは必ずtrueを返すようにします
}
}
rpc/literal形式もしくはdocument/literal形式でparameterStyle属性にBAREを指定したWebサービスは、 java.util.Collectionクラスの送受信をサポートしていません。java.util.Collectionクラスを送受信する場合は、document/literal形式の parameterStyle属性にWRAPPEDを利用してください。
例) WSDLで指定する場合
<xs:complexType name="someOperation"> <xs:sequence> <xs:element name="arg0" type="xs:int"/> <xs:element name="arg1" type="xs:int"/> // bareだと同じパラメータは1回しか現れない </xs:sequence> </xs:complexType> <message name="someOperation"> <part name="parameters" element="tns:someOperation"/> // bareだとここでパラメータを複数指定する </message> <operation name="someOperation"> <input message="tns:someOperation"/> <output message="tns:someOperationResponse"/> </operation>
例) プログラムで指定する場合、デフォルトでdocument/literalのwrapped型が使用されます。javax.jws.soap.SOAPBindingアノテーションで指定するため、プログラム中でjavax.jws.soap.SOAPBindingアノテーションを指定している場合は注意が必要です。
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT,
use=SOAPBinding.Use.LITERAL,
parameterStyle=SOAPBinding.ParameterStyle.WRAPPED)
@WebService
public class ServerImpl {
public int someOperation(int arg0, int arg1) {
:
:
}
}
配備記述子に記述するエンドポイントURLでは、暗黙URL(URLに"*."を利用している)はサポートしていません。
メソッドのパラメータや戻り値にインタフェースを指定することはできません。メソッドのパラメータや戻り値には、実装クラスを指定するようにしてください。
WebOTXにJAX-RSの実装としてJerseyを取り込んでいますが、WebOTXのJerseyではなく、やむを得ずオープンソースソフトウェア(OSS)として公開されるJerseyをアプリケーション中で使用する必要がある場合には、以下の手順を実施ください。
grant codeBase "file:${com.nec.webotx.instanceRoot}/lib/-" {
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
permission org.osgi.framework.AdminPermission "*", "resource";
permission java.lang.RuntimePermission "createClassLoader";
};
以下の点をご注意ください。