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例外の伝搬方法
- (2) Java例外の伝搬時の動作(Webサービス側)
- (3) Java例外の伝搬時の動作(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例外の伝搬時に,detail要素,またはsoapenv12:Detail要素の子要素として,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" ?>
<S:Envelope xmlns:S= "http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:Fault xmlns:ns2="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns3="http://www.w3.org/2003/05/soap-envelope">
<faultcode>ns2: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>
</ns2:Fault>
</S:Body>
</S:Envelope> |
送信されるSOAP 1.2仕様のSOAPフォルトメッセージの例を示します(実際は,改行およびインデントはありません)。
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Body>
<ns3:Fault xmlns:ns2="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns3="http://www.w3.org/2003/05/soap-envelope">
<ns3:Code>
<ns3:Value>ns3:Receiver</ns3:Value>
</ns3:Code>
<ns3:Reason>
<ns3:Text xml:lang="ja">Something illegal.</ns3:Text>
</ns3:Reason>
<ns3:Detail>
<env:Detail xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<detailTest>TEST.</detailTest>
</env:Detail>
<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>
</ns3:Detail>
</ns3:Fault>
</S:Body>
</S:Envelope> |
(3) Java例外の伝搬時の動作(Webサービスクライアント側)
Webサービスクライアント側でのJava例外の伝搬時に,Webサービスクライアントにスローするラッパ例外クラス,またはjavax.xml.ws.soap.SOAPFaultExceptionのcauseに,{http://jax-ws.dev.java.net/}exception要素の情報からアンマーシャルした例外(Webサービス側で発生した例外)が設定されます。
Webサービスクライアントは,getCauseメソッドを実行することで,Webサービス側で発生した例外を取得できます。