10.4.1 Webサービス側のフォルトおよび例外の処理
Webサービス側のJAX-WSエンジンでのフォルトおよび例外の処理について説明します。なお,Webサービスがプロバイダ実装クラスで実装されている場合,この処理は実行されません。
- 〈この項の構成〉
(1) サービス固有例外の処理
WSDLのフォルトとJavaの例外は,JAX-WS 2.2仕様に従ってマッピングされます。WSDLのフォルトとJavaの例外クラスのマッピング例を次の図に示します。
マッピング例では,UserDefinedFaultフォルトがフォルトbean(com.example.sample.UserDefinedFault)と,ラッパ例外クラス(com.example.sample.UserDefinedException)にマッピングされていることがわかります。
フォルトと例外クラスのマッピングについては,「15.1.7 フォルトから例外クラスへのマッピング」,および「16.1.7 Javaのラッパ例外クラスからフォルトへのマッピング」を参照してください。
Webサービス側のJAX-WSエンジンによって,ラッパ例外クラスは次の表のようにSOAPフォルトにバインディングされます。
項番 |
SOAPフォルトの子要素 |
内容 |
|
---|---|---|---|
SOAP 1.1仕様 |
SOAP 1.2仕様 |
||
1 |
faultcode |
soapenv12:Code |
|
2 |
faultstring |
soapenv12:Reason |
ラッパ例外クラスに対してgetMessageメソッドを実行した結果になります。 |
3 |
faultactor |
soapenv12:Role |
ありません。 |
4 |
detail |
soapenv12:Detail |
フォルトbeanをマーシャルした結果になります。 |
ラッパ例外クラスをWebサービス実装クラスでスローする例を示します。
//フォルトbeanを生成し,マーシャルすべき情報を設定する UserDefinedFault fault = new UserDefinedFault(); fault.additionalInfo = 257; fault.detail = "Failed by some reason."; fault.message = "Contact your administrator."; //ラッパ例外クラスをスロー throw new UserDefinedException( "Something happens.", fault );
送信される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 happens.</faultstring> <detail> <ns2:UserDefinedFault xmlns:ns2="http://example.com/sample"> <additionalInfo>257</additionalInfo> <detail>Failed by some reason.</detail> <message>Contact your administrator.</message> </ns2:UserDefinedFault> </detail> </S:Fault> </S:Body> </S:Envelope>
- 注
-
SOAPフォルトメッセージには,SOAP 1.1仕様とSOAP 1.2仕様の名前空間定義が必ず含まれます。
送信される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 happens.</S:Text> </S:Reason> <S:Detail> <ns2:UserDefinedFault xmlns:ns2="http://example.com/sample"> <additionalInfo>257</additionalInfo> <detail>Failed by some reason.</detail> <message>Contact your administrator.</message> </ns2:UserDefinedFault> </S:Detail> </S:Fault> </S:Body> </S:Envelope>
- 注
-
SOAPフォルトメッセージには,SOAP 1.1仕様とSOAP 1.2仕様の名前空間定義が必ず含まれます。
(2) ランタイム例外のバインディング
Webサービス実装クラス内でjavax.xml.ws.WebServiceException以外のランタイム例外がスローされた場合,Webサービス側のJAX-WSエンジンによって,ランタイム例外がSOAPフォルトにバインディングされます(JAX-WS 2.2仕様に基づいてバインディング)。
ランタイム例外のバインディングの例を次の表に示します。
項番 |
SOAPフォルトの子要素 |
内容 |
|
---|---|---|---|
SOAP 1.1仕様 |
SOAP 1.2仕様 |
||
1 |
faultcode |
soapenv12:Code |
|
2 |
faultstring |
soapenv12:Reason |
ランタイム例外に対してgetMessageメソッドを実行した結果になります。 |
3 |
faultactor |
soapenv12:Role |
ありません。 |
4 |
detail |
soapenv12:Detail |
ありません。 |
ランタイム例外のスローの例を示します。
//ランタイム例外をスロー throw new IllegalArgumentException( "Something illegal." );
送信される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> </S:Fault> </S:Body> </S:Envelope
- 注
-
SOAPフォルトメッセージには,SOAP 1.1仕様とSOAP 1.2仕様の名前空間定義が必ず含まれます。
送信される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:Fault> </S:Body> </S:Envelope>
- 注
-
SOAPフォルトメッセージには,SOAP 1.1仕様とSOAP 1.2仕様の名前空間定義が必ず含まれます。
(3) javax.xml.ws.WebServiceExceptionのバインディング
Webサービス実装クラスまたはプロバイダ実装クラス内でjavax.xml.ws.soap.SOAPFaultException以外のjavax.xml.ws.WebServiceExceptionがスローされた場合,Webサービス側のJAX-WSエンジンによって,javax.xml.ws.WebServiceExceptionがSOAPフォルトにバインディングされます(JAX-WS 2.2仕様に基づいてバインディング)。
javax.xml.ws.WebServiceExceptionのバインディングの例を次の表に示します。
項番 |
SOAPフォルトの子要素 |
内容 |
|
---|---|---|---|
SOAP 1.1仕様 |
SOAP 1.2仕様 |
||
1 |
faultcode |
soapenv12:Code |
|
2 |
faultstring |
soapenv12:Reason |
javax.xml.ws.soap.SOAPFaultExceptionに対してgetMessageメソッドを実行した結果になります。SOAP 1.2の場合,xml:lang属性にはJavaVMのデフォルトのロケールが設定されます。 |
3 |
faultactor |
soapenv12:Role |
ありません。 |
4 |
detail |
soapenv12:Detail |
ありません。 |
javax.xml.ws.WebServiceExceptionのスローの例を示します。
//javax.xml.ws.WebServiceExceptionをスロー throw new javax.xml.ws.WebServiceException( "Web Service Exception." );
送信される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>Web Service Exception.</faultstring> </S:Fault> </S:Body> </S:Envelope>
- 注
-
SOAPフォルトメッセージには,SOAP 1.1仕様とSOAP 1.2仕様の名前空間定義が必ず含まれます。
送信される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:Fault> </S:Body> </S:Envelope>
- 注
-
SOAPフォルトメッセージには,SOAP 1.1仕様とSOAP 1.2仕様の名前空間定義が必ず含まれます。
(4) javax.xml.ws.soap.SOAPFaultExceptionのバインディング
Webサービス実装クラスまたはプロバイダ実装クラス内で,javax.xml.ws.soap.SOAPFaultExceptionがスローされた場合,Webサービス側のJAX-WSエンジンによって,javax.xml.ws.soap.SOAPFaultExceptionがSOAPフォルトにバインディングされます(JAX-WS 2.2仕様に基づいてバインディング)。
javax.xml.ws.soap.SOAPFaultExceptionのバインディングの例を次の表に示します。
項番 |
SOAPフォルトの子要素 |
内容 |
|
---|---|---|---|
SOAP 1.1仕様 |
SOAP 1.2仕様 |
||
1 |
faultcode |
soapenv12:Code |
|
2 |
faultstring |
soapenv12:Reason |
getFaultReasonTextメソッドの結果になります。 ただし,nullの場合はgetMessageメソッドを実行した結果になります。 |
3 |
faultactor |
soapenv12:Role |
getFault().getFaultRoleメソッドの結果になります。 ただし,nullの場合はありません。 |
4 |
detail |
soapenv12:Detail |
getFault().getDetailメソッドを実行した結果をマーシャルした結果になります。 ただし,nullの場合はありません。 |
SOAP 1.1仕様の場合の,javax.xml.ws.soap.SOAPFaultExceptionのスローの例を示します。
SOAPFault soapFault = ...; soapFault.setFaultCode( new QName( "http://sample.org", "UserDefined" ) ); soapFault.setFaultActor( "http://example.com/sample" ); soapFault.setFaultString( "SOAPFaultException happens." ); Detail detail = soapFault.addDetail(); SOAPElement soapElement = detail.addChildElement( new QName( "", "detailTest" ) ); soapElement.addTextNode( "TEST." ); //javax.xml.ws.soap.SOAPFaultExceptionをスロー throw new SOAPFaultException( soapFault );
SOAP 1.2仕様の場合の,javax.xml.ws.soap.SOAPFaultExceptionのスローの例を示します。
SOAPFactory soapFactory = SOAPFactory.newInstance( SOAPConstants.SOAP_1_2_PROTOCOL ); SOAPFault soapFault = soapFactory.createFault(); soapFault.appendFaultSubcode( new QName( "http://sample.org", "UserDefined" ) ); soapFault.setFaultRole( "http://example.com/sample" ); soapFault.addFaultReasonText( "SOAPFaultException happens.", Locale.getDefault() ); Detail detail = soapFault.addDetail(); SOAPElement soapElement = detail.addChildElement( new QName( "", "detailTest" ) ); soapElement.addTextNode( "TEST." ); //javax.xml.ws.soap.SOAPFaultExceptionをスロー throw new SOAPFaultException( soapFault );
送信される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 xmlns:ns0="http://sample.org">ns0:UserDefined</faultcode> <faultstring>SOAPFaultException happens.</faultstring> <faultactor>http://example.com/sample</faultactor> <detail><detailTest>TEST.</detailTest></detail> </S:Fault> </S:Body> </S:Envelope>
- 注
-
SOAPフォルトメッセージには,SOAP 1.1仕様とSOAP 1.2仕様の名前空間定義が必ず含まれます。
送信される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:Sender</S:Value> <S:Subcode> <S:Value xmlns:ns0="http://sample.org">ns0:UserDefined</S:Value> </S:Subcode> </S:Code> <S:Reason> <S:Text xml:lang="ja">SOAPFaultException happens.</S:Text> </S:Reason> <S:Role>http://example.com/sample</S:Role> <S:Detail> <detailTest>TEST.</detailTest> </S:Detail> </S:Fault> </S:Body> </S:Envelope>
- 注
-
SOAPフォルトメッセージには,SOAP 1.1仕様とSOAP 1.2仕様の名前空間定義が必ず含まれます。