0

将肥皂体中发现的肥皂故障移动到 Spring Web 服务中发现的响应的肥皂头的最佳方法是什么?有什么例子吗?

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

public class LisSoapFaultTranslatorExceptionResolver extends SoapFaultMappingExceptionResolver {

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

        fault = null;
    }
}
4

2 回答 2

2

来自W3Schools

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

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

如果您的 SOAP 错误出现在响应的头部,那么您的 SOAP 信封不再遵循规范。你不应该那样做。而且我怀疑实现 SOAP 接口的框架甚至可以让你这样做。

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

规范

要被识别为携带 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 响应,否则自己生成。

于 2013-03-20T15:58:11.780 回答
1

我可以通过在标题中添加项目来做到这一点。

弹簧配置文件:

<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;
    }
}
于 2013-03-20T17:25:03.437 回答