matsukaz's blog

Agile, node.js, ruby, AWS, cocos2d-xなどなどいろいろやってます

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>