Spring Web Services まとめ その7
Exceptionのハンドリング (Chapter5)
Spring-WSは、アプリケーション内で発生したExceptionをハンドリングするため、EndpointExceptionResolverインタフェース、およびそのデフォルト実装としてSimpleSoapExceptionResolverやSoapFaultMappingExceptionResolverクラスを提供している。これらのクラスを利用することで、アプリケーション内でExceptionが発生した場合にSOAP Faultを返すことができる。
以下は、SoapFaultMappingExceptionResolverの利用例である。
<beans> <bean id="exceptionResolver" class="org.springframework.ws.soap.server.endpoint.SoapFaultMappingExceptionResolver"> <property name="defaultFault" value="SERVER"> </property> <property name="exceptionMappings"> org.springframework.oxm.ValidationFailureException=CLIENT,Invalid request </property> </bean> </beans>
この例では、org.springframework.oxm.ValidationFailureExceptionが発生した場合、以下のSOAP Faultが返される。
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Client</faultcode>
<faultstring>Invalid request</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
またorg.springframework.oxm.ValidationFailureException以外のExceptionが発生した場合は、以下のSOAP Faultが返される。
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Server</faultcode>
<faultstring><!-- 発生したExceptionのメッセージ --></faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
コンフィギュレーションへの記述の他に、Exceptionに対して@SoapFaultアノテーションを追加することで、そのExceptionが発生した場合に返されるSOAP Faultを指定することもできる。以下はその例である。
package samples; import org.springframework.ws.soap.server.endpoint.annotation.FaultCode; import org.springframework.ws.soap.server.endpoint.annotation.SoapFault; @SoapFault(faultCode = FaultCode.SERVER) public class MyBusinessException extends Exception { public MyClientException(String message) { super(message); } }
MyClientException生成時のコンストラクタに"Oops!"を指定した場合には、以下のようなSOAP Faultが返される。
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body> <SOAP-ENV:Fault> <faultcode>SOAP-ENV:Server</faultcode> <faultstring>Oops!</faultstring> </SOAP-ENV:Fault> </SOAP-ENV:Body> </SOAP-ENV:Envelope>