2013-03-20 88 views
1

在Spring Web服務中捕獲異常並提取其詳細信息並將其格式化爲soap響應的最佳方法是什麼?我的錯誤消息詳細信息必須放在Soap響應的標題中。在Spring Web服務攔截器中捕獲異常並返回SOAP響應

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ims="http://www.imsglobal.org/services/lis/cmsv1p0/wsdl11/sync/imscms_v1p"> 
    <soapenv:Header> 
     <imsx_syncResponseHeaderInfo xmlns="http://www.imsglobal.org/services/lis/cmsv1p0/wsdl11/sync/imscms_v1p0"> 
     <imsx_version>V1.0</imsx_version> 
     <imsx_messageIdentifier>4</imsx_messageIdentifier> 
     <imsx_statusInfo> 
      <imsx_codeMajor>failure</imsx_codeMajor> 
      <imsx_severity>status</imsx_severity> 
      <imsx_codeMinor> 
       <imsx_codeMinorField> 
        <imsx_codeMinorFieldName>TargetEndSystem</imsx_codeMinorFieldName> 
        <imsx_codeMinorFieldValue>incompletedata</imsx_codeMinorFieldValue> 
       </imsx_codeMinorField> 
      </imsx_codeMinor> 
     </imsx_statusInfo> 
     </imsx_syncResponseHeaderInfo> 
    </soapenv:Header> 
    <soapenv:Body/> 
</soapenv:Envelope> 

回答

2

我不知道這是否是最好的辦法,但我添加了一個SimpleSoapExceptionResolver對象:

import java.util.Date; 
import java.util.Locale; 
import org.apache.log4j.Logger; 
import org.springframework.ws.WebServiceMessage; 
import org.springframework.ws.context.MessageContext; 
import org.springframework.ws.soap.SoapBody; 
import org.springframework.ws.soap.SoapFault; 
import org.springframework.ws.soap.SoapMessage; 
import org.springframework.ws.soap.server.endpoint.SimpleSoapExceptionResolver; 

public final class MySimpleSoapExceptionResolver 
extends SimpleSoapExceptionResolver { 

    public MySimpleSoapExceptionResolver() { 
     super.setOrder(HIGHEST_PRECEDENCE);  
    } 

    @Override 
    protected void customizeFault( final MessageContext messageContext_, 
            final Object endpoint_, 
            final Exception exception_, 
            SoapFault soapFault_) { 

     WebServiceMessage _webServiceMessageResponse = 
           messageContext_.getResponse(); 
     SoapMessage _soapMessage = (SoapMessage) _webServiceMessageResponse; 
     SoapBody _soapBody = _soapMessage.getSoapBody(); 

     String _message = "your error message"; 

     Logger _logger = Logger.getLogger(MySimpleSoapExceptionResolver.class); 
     _logger.error(_message, exception_); 
     soapFault_ = 
     _soapBody.addServerOrReceiverFault(_message, Locale.ENGLISH); 


    } 

} 
+0

這實際上可能工作,讓我試試。 – 2013-03-21 16:37:31

0

你或許可以實現類型org.springframework.ws.server.endpoint.interceptor.EndpointInterceptorAdapter的攔截。在您的web服務配置中註冊您的攔截器。

這樣實現的方法用handleResponse(MessageContext的MessageContext的,對象終點) -

handleResponse(MessageContext messageContext, Object endpoint) { 
    SoapMessage msg = (SoapMessage) messageContext.getResponse(); 
    SoapHeader header = msg.getSoapHeader(); 
    // do what you want to do with header. 
} 

我還沒有實現這一點,但做了類似的東西在CXF攔截器。