如何处理肥皂:mustUnderstand =" 1"在Web服务中

时间:2014-04-03 08:58:07

标签: java xml web-services soap wsdl

在传入的soap请求中,soap头中有一个soap:mustUnderstand =“1”元素,如何在我的Web服务中处理此问题。如果soap:mustUnderstand =“1”它会在0(soap:mustUnderstand =“0”)时抛出异常,它会按预期运行。

这是我的部分肥皂请求就像这样

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header xmlns="http://www.xxxxxxx/zzzzz-msg/schema/msg-header-1_0.xsd">
          <MessageHeader ResponseRequested="true" version="1.0" Terminate="true" Reverse="true" id="0002P559C1" soap:mustUnderstand="1">

   .......
   ......

我正在使用Apache CXF进行网络服务。

2 个答案:

答案 0 :(得分:1)

您的服务应明确告知CXF已理解并处理了给定的标头。

执行此操作的一种方法是注册SOAPHandler的子类,负责实际处理您的标头。在该接口中,重要的是实现方法Set<QName> getHeaders()并返回一组处理程序所关注的标题名称。

然后,CXF会将所有这些标题视为理解

示例:

在Spring上下文XML中:

<jaxws:endpoint ...>
    <jaxws:handlers>
        <bean class="example.MySOAPHandler" />
    </jaxws:handlers>
</jaxws:endpoint>

在Java代码中:

public class MySOAPHandler implements SOAPHandler<SOAPMessageContext> {
    public static final String MY_NS_URI = "http://www.xxxxxxx/zzzzz-msg/schema/msg-header-1_0.xsd";
    public static final String MY_HEADER_NAME = "MessageHeader";

    @Override
    public Set<QName> getHeaders() {
        // This will tell CXF that the following headers are UNDERSTOOD
        return Collections.singleton(new QName(MY_NS_URI, MY_HEADER_NAME));
    }

    // other handler methods here
}

答案 1 :(得分:0)

  

如果标题块使用mustUnderstand =“1”注释并且   接收器的设计不支持给定的标头,即消息   不应该处理,并且应该将错误返回给发件人   (使用soap:MustUnderstand状态代码)。当mustUnderstand =“0”或   mustUnderstand属性不存在,接收者可以忽略   那些标题并继续处理。 mustUnderstand属性   在整个SOAP处理模型中起着核心作用。

有关详细信息,请参阅此link