使用Spring WS将肥皂体的故障移入肥皂头

时间:2013-03-20 15:55:11

标签: java spring soap spring-ws fault

将肥皂体中发现的肥皂缺陷移到Spring网络服务中发现的响应的肥皂头的最佳方法是什么?那里有什么例子吗?

我可以拦截错误,但我不认为我可以用这个解析器修改任何东西。

public class LisSoapFaultTranslatorExceptionResolver extends SoapFaultMappingExceptionResolver {

    @Override
    protected void customizeFault(Object endpoint, Exception ex, SoapFault fault) {

        fault = null;
    }
}

2 个答案:

答案 0 :(得分:2)

来自W3Schools

  

可选的SOAP Fault元素用于指示错误消息。

     

如果存在Fault元素,它必须显示为Body元素的子元素。 Fault元素只能在SOAP消息中出现一次。

如果您的SOAP错误位于响应的头部,则SOAP信封不再符合规范。你不应该这样做。我怀疑实现SOAP接口的框架甚至可以让你这样做。

要被识别为携带SOAP错误信息,SOAP消息必须包含单个SOAP Fault元素信息项作为SOAP Body的唯一子元素信息项。

来自Spec

  

被识别为携带SOAP错误信息,SOAP消息   必须包含一个SOAP Fault元素信息项作为唯一   SOAP Body的子元素信息项。

     

生成错误时,SOAP发件人不得包含其他内容   SOAP Body中的元素信息项。一条消息,其身体   包含一个错误加上额外的元素信息项没有   SOAP定义的语义。

     

SOAP Fault元素信息项可能出现在SOAP标头中   阻止,或作为子元素信息项的后代   SOAP Body;在这种情况下,该元素没有SOAP定义的语义。

如果您这样做,重要的部分是the element has no SOAP-defined semantics。我想你自己就是这个。如果没有错误,可以使用Spring生成SOAP响应,否则自己生成它。

答案 1 :(得分:1)

我可以通过向标题添加项目来实现这一点。

Spring配置文件:

<sws:interceptors>    
    <sws:payloadRoot
    namespaceUri="http://www.imsglobal.org/services/lis/cmsv1p0/wsdl11/sync/imscms_v1p0">
        <bean class="com.openclass.adapter.interceptors.LisResponseInterceptor"/>    
    </sws:payloadRoot>  
</sws:interceptors>

Java代码:

public class LisResponseInterceptor extends EndpointInterceptorAdapter {

    @Override
    public boolean handleResponse(MessageContext messageContext, Object endpoint{
        return true;
    }

    @Override
    public boolean handleRequest(MessageContext messageContext, Object endpoint){
        return true;
    }

    @Override
    public boolean handleFault(MessageContext messageContext, Object endpoint){

        SoapMessage response = (SoapMessage) messageContext.getResponse();
        SoapHeader header = response.getSoapHeader();
        header.addHeaderElement(new QName("ims","imsx_syncRequestHeaderInfo"));

        return true;
    }
}