【问题标题】:Move Fault From Soap Body into Soap Head with Spring WS使用 Spring WS 将故障从肥皂体移动到肥皂头
【发布时间】:2013-03-20 15:55:10
【问题描述】:

将soap主体中发现的soap错误移动到Spring Web服务中发现的响应的soap头的最佳方法是什么?有什么例子吗?

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

public class LisSoapFaultTranslatorExceptionResolver extends SoapFaultMappingExceptionResolver {

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

        fault = null;
    }
}

【问题讨论】:

    标签: java spring soap spring-ws fault


    【解决方案1】:

    来自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 定义的语义。

    如果你这样做,重要的部分是the element has no SOAP-defined semantics。我想你是靠你自己的。如果没有故障,可能使用 Spring 生成 SOAP 响应,否则自行生成。

    【讨论】:

    • 我们遵循的规范就是这样做的,imsglobal.org/lis/lisv2p0/LISv2p0BestPracticev1p0.html。 “SOAP 错误在 SOAP 标头中报告。这意味着当发出 SOAP 请求消息时,响应消息可能包含没有更多有用信息的 SOAP 错误代码。”
    • 我知道你的意思,但我可以与他们的规范争论。我只是想要一个解决方案的伙伴。
    • 一个的解决方案是在出现故障时自己编写 SOAP 响应。
    • 好吧,我想我可以修改进入我的 Web 服务的消息上下文参数,但我认为抛出异常、捕获它然后修改标头会更干净。例外情况包括缺少必填字段。
    • 我没有使用 Spring-WS 的经验,您是否可以在响应 OutputStream 刷新之前访问它?
    【解决方案2】:

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

    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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多