10.4.3 Java例外の伝搬
WebサービスおよびWebサービスクライアントの両方が,Application ServerのJAX-WSエンジン上にデプロイされている場合,Webサービスで発生したJava例外をWebサービスクライアントに伝搬できます。POJOとEJBの両方のWebサービスで動作します。ここでは,Java例外の伝搬方法と動作について説明します。
- 注意事項
-
Java例外の伝搬は,SOAP 1.1仕様や,JAX-WS 2.2仕様で定められた機能ではないため,Application ServerのJAX-WS機能以外のWebサービス基盤製品と接続した場合に,意図しない動作をしたり,通信が失敗したりするおそれがあります。また,スタックトレースには,Webサービスの実装の内部情報(システムの設定情報や個人情報を扱っているのであればそのような情報など)も含まれることがあります。したがって,実運用でこの機能を使用することを想定して,Webサービスを実装することはお勧めしません。開発時に必要に応じて使用してください。
(1) Java例外の伝搬方法
Webサービスで発生したJava例外を伝搬するには,動作定義ファイルでcom.cosminexus.jaxws.fault.SOAPFaultBuilder.captureStackTraceプロパティにtrueを設定します。
com.cosminexus.jaxws.fault.SOAPFaultBuilder.captureStackTraceプロパティについては,「10.1.2 共通定義ファイルの設定項目」を参照してください。
(2) Java例外の伝搬時の動作(Webサービス側)
Webサービス側でのJava例外の伝搬時に,「10.4.1(2)」の「表10-7の項番4」,「10.4.1(3)」の「表10-8の項番4」および「10.4.1(4)」の「表10-9の項番4」にある要素の子要素として,Application ServerのJAX-WS機能独自の{http://jax-ws.dev.java.net/}exception要素が追加され,発生したJava例外のスタックトレースがマーシャルされます。
また,「10.4.1(1)」の「表10-6の項番4」にバインドされるフォルトbeanが存在しない場合,Webサービス側でのJava例外の伝搬時に,「10.4.1(1)」の「表10-6の項番4」にある要素の子要素として,Application ServerのJAX-WS機能独自の{http://jax-ws.dev.java.net/}exception要素が追加され,発生したJava例外のスタックトレースがマーシャルされます。
ランタイム例外のスローの例を示します。
//ランタイム例外をスロー
catch( NullPointerException ){
throw new IllegalArgumentException( "Something illegal.", e );
}このようにスローされた場合に,送信されるSOAP 1.1仕様のSOAPフォルトメッセージの例を示します(実際は,改行およびインデントはありません)。
<?xml version="1.0" encoding="utf-8"?>
<S:Envelope xmlns:S= "http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<S:Fault xmlns:ns3="http://www.w3.org/2003/05/soap-envelope">
<faultcode>S:Server</faultcode>
<faultstring>Something illegal.</faultstring>
<detail>
<ns2:exception xmlns:ns2="http://jax-ws.dev.java.net/"
class="java.lang.IllegalArgumentException"
note="To disable this feature, set com.cosminexus.jaxws.fault.SOAPFaultBuilder.captureStackTrace property to false">
<message>Something illegal</message>
<ns2:stackTrace>
<ns2:frame class="com.example.sample.TestJaxWsImpl" file="TestJaxWsImpl.java" line="32" method="jaxWsTest1"/>
<ns2:frame class="sun.reflect.NativeMethodAccessorImpl" file="NativeMethodAccessorImpl.java" line="native" method="invoke0"/>
<ns2:frame class="sun.reflect.NativeMethodAccessorImpl" file="NativeMethodAccessorImpl.java" line="39" method="invoke"/>
...
<ns2:frame class="java.lang.Thread" file="Thread.java" line="595" method="run"/>
</ns2:stackTrace>
<ns2:cause class="java.lang.NullPointerException"
note="To disable this feature, set com.cosminexus.jaxws.fault.SOAPFaultBuilder.captureStackTrace property to false">
<message>Something null.</message>
<ns2:stackTrace>
<ns2:frame class="com.example.sample.TestJaxWsImpl" file="TestJaxWsImpl.java" line="32" method="jaxWsTest1"/>
<ns2:frame class="sun.reflect.NativeMethodAccessorImpl" file="NativeMethodAccessorImpl.java" line="native" method="invoke0"/>
...
<ns2:frame class="sun.reflect.DelegatingMethodAccessorImpl" file="DelegatingMethodAccessorImpl.java" line="25" method="invoke"/>
<ns2:frame class="java.lang.reflect.Method" file="Method.java" line="585" method="invoke"/>
<ns2:frame class="org.apache.tomcat.util.threads.ThreadPool$ControlRunnable" file="ThreadPool.java" line="1510" method="run"/>
<ns2:frame class="java.lang.Thread" file="Thread.java" line="595" method="run"/>
</ns2:stackTrace>
</ns2:cause>
</ns2:exception>
</detail>
</S:Fault>
</S:Body>
</S:Envelope>送信されるSOAP 1.2仕様のSOAPフォルトメッセージの例を示します(実際は,改行およびインデントはありません)。
<?xml version="1.0" encoding="utf-8"?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Body>
<S:Fault xmlns:ns3="http://schemas.xmlsoap.org/soap/envelope/">
<S:Code>
<S:Value>S:Receiver</S:Value>
</S:Code>
<S:Reason>
<S:Text xml:lang="ja">Something illegal.</S:Text>
</S:Reason>
<S:Detail>
<detailTest>TEST.</detailTest>
<ns2:exception xmlns:ns2="http://jax-ws.dev.java.net/"
class="javax.xml.ws.soap.SOAPFaultException"
note="To disable this feature, set com.cosminexus.jaxws.fault.SOAPFaultBuilder.captureStackTrace property to false">
...
(SOAP 1.1仕様のSOAPフォルトと同じ)
...
</ns2:exception>
</S:Detail>
</S:Fault>
</S:Body>
</S:Envelope>
(3) Java例外の伝搬時の動作(Webサービスクライアント側)
Webサービスクライアント側でのJava例外の伝搬時に,Webサービスクライアントにスローするラッパ例外クラス,またはjavax.xml.ws.soap.SOAPFaultExceptionのcauseに,{http://jax-ws.dev.java.net/}exception要素の情報からアンマーシャルしたcom.cosminexus.xml.ws.developer.ServerSideExceptionが設定されます。
Webサービスクライアントは,javax.xml.ws.soap.SOAPFaultExceptionのgetCauseメソッドを実行することで,Webサービス側で発生した例外のスタックトレースを含むcom.cosminexus.xml.ws.developer.ServerSideExceptionを取得できます。