org.apache.axis2.AxisFault:header http://www.ebxml.org/namespaces/messageHeader 的必须理解检查失败

org.apache.axis2.AxisFault: Must Understand check failed for header http://www.ebxml.org/namespaces/messageHeader

我使用的是 Axis2-1.6.3,并且能够成功发送 SOAP 请求。这是请求的示例:(我正在调用 session Create Service of Sabre)

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header>
        <ns4:MessageHeader
            xmlns:ns4="http://www.ebxml.org/namespaces/messageHeader" soapenv:mustUnderstand="0">
            <ns4:From>
                <ns4:PartyId>client.webconnect@sabre.com</ns4:PartyId>
            </ns4:From>
            <ns4:To>
                <ns4:PartyId>sabre.webconnect@sabre.com</ns4:PartyId>
            </ns4:To>
            <ns4:CPAId>QI6D</ns4:CPAId>
            <ns4:ConversationId>sabre@12345.com</ns4:ConversationId>
            <ns4:Service>SessionCreateRQ</ns4:Service>
            <ns4:Action>SessionCreateRQ</ns4:Action>
            <ns4:MessageData>
                <ns4:MessageId>mid:20001209-133003-2333@resourcecentre.abacus.com.sg</ns4:MessageId>
                <ns4:Timestamp>2007-08-28T11:15:12Z</ns4:Timestamp>
            </ns4:MessageData>
        </ns4:MessageHeader>
        <ns6:Security
            xmlns:ns6="http://schemas.xmlsoap.org/ws/2002/12/secext" soapenv:mustUnderstand="0">
            <ns6:UsernameToken>
                <ns6:Username>9102</ns6:Username>
                <ns6:Password>focus75</ns6:Password>
                <Organization>QI6D</Organization>
                <Domain>DEFAULT</Domain>
            </ns6:UsernameToken>
        </ns6:Security>
    </soapenv:Header>
    <soapenv:Body>
        <ns1:SessionCreateRQ
            xmlns:ns1="http://www.opentravel.org/OTA/2002/11" returnContextID="false">
            <ns1:POS>
                <ns1:Source PseudoCityCode="QI6D"/>
            </ns1:POS>
        </ns1:SessionCreateRQ>
    </soapenv:Body>
</soapenv:Envelope>

收到响应后,抛出此异常:

 org.apache.axis2.AxisFault: Must Understand check failed for header http://www.ebxml.org/namespaces/messageHeader : MessageHeader
        at org.apache.axis2.engine.AxisEngine.checkMustUnderstand(AxisEngine.java:105) ~[axis2-1.6.3.jar:na]
        at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:171) ~[axis2-1.6.3.jar:na]
        at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:364) [axis2-1.6.3.jar:na]
        at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:421) [axis2-1.6.3.jar:na]
        at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229) [axis2-1.6.3.jar:na]
        at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165) [axis2-1.6.3.jar:na]
        at com.sabre.webservices.websvc.SessionCreateRQServiceStub.sessionCreateRQ(SessionCreateRQServiceStub.java:212) [classes/:na]
        at com.wipro.w2g.partner.airline.calendarShopping.sabre.SessionCreateServiceImpl.createSabreSession(SessionCreateServiceImpl.java:175) [classes/:na]
        at com.wipro.w2g.partner.airline.calendarShopping.manager.CalendarShoppingSessionManager.createSabreSession(CalendarShoppingSessionManager.java:279) [classes/:na]
        at com.wipro.w2g.partner.airline.calendarShopping.services.flow.CalendarShoppingServiceFlow.getCalendarShoppingFlightSearch(CalendarShoppingServiceFlow.java:221) [classes/:na]
        at com.wipro.w2g.partner.airline.calendarShopping.manager.CalendarShoppingSegmentHandlerImpl.searchSegmentHandlerImpl(CalendarShoppingSegmentHandlerImpl.java:51) [classes/:na]
        at com.wipro.w2g.partner.airline.calendarShopping.spring.appcontainer.AsyncAppPartnerHandler.asyncCallForAllPartners(AsyncAppPartnerHandler.java:37) [classes/:na]
        at com.wipro.w2g.partner.airline.calendarShopping.manager.CalendarShoppingServiceAction.asyncCallToAllPartners(CalendarShoppingServiceAction.java:213) [classes/:na]
        at com.wipro.w2g.partner.airline.calendarShopping.manager.CalendarShoppingServiceAction.manageCalendarShoppingServiceCall(CalendarShoppingServiceAction.java:107) [classes/:na]
        at com.wipro.w2g.partner.airline.calendarShopping.manager.CalendarShoppingManager.invokeCalendarShoppingServiceAsyncronously(CalendarShoppingManager.java:87) [classes/:na]
        at com.wipro.w2g.partner.airline.calendarShopping.manager.CalendarShoppingManager$$FastClassBySpringCGLIB$$c61f4c16.invoke(<generated>) [classes/:na]
        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) [spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738) [spring-aop-4.3.13.RELEASE.jar:4.3.13.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) [spring-aop-4.3.13.RELEASE.jar:4.3.13.RELEASE]
        at org.springframework.aop.interceptor.AsyncExecutionInterceptor.call(AsyncExecutionInterceptor.java:115) [spring-aop-4.3.13.RELEASE.jar:4.3.13.RELEASE]
        at java.util.concurrent.FutureTask.run(Unknown Source) [na:1.8.0_101]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.8.0_101]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.8.0_101]
        at java.lang.Thread.run(Unknown Source) [na:1.8.0_101]

这是回复xml

<?xml version='1.0' encoding='utf-8'?>
<soap-env:Envelope
    xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
    <soap-env:Header>
        <eb:MessageHeader
            xmlns:eb="http://www.ebxml.org/namespaces/messageHeader" eb:version="1.0" soap-env:mustUnderstand="1">
            <eb:From>
                <eb:PartyId eb:type="URI">sabre.webconnect@sabre.com</eb:PartyId>
            </eb:From>
            <eb:To>
                <eb:PartyId eb:type="URI">client.webconnect@sabre.com</eb:PartyId>
            </eb:To>
            <eb:CPAId>QI6D</eb:CPAId>
            <eb:ConversationId>sabre@12345.com</eb:ConversationId>
            <eb:Service>SessionCreateRQ</eb:Service>
            <eb:Action>ErrorRS</eb:Action>
            <eb:MessageData>
                <eb:MessageId>1961156184619800211</eb:MessageId>
                <eb:Timestamp>2018-09-25T05:07:42</eb:Timestamp>
                <eb:RefToMessageId>mid:20001209-133003-2333@resourcecentre.abacus.com.sg</eb:RefToMessageId>
            </eb:MessageData>
        </eb:MessageHeader>
        <wsse:Security
            xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/12/secext"/>
        </soap-env:Header>
        <soap-env:Body>
            <soap-env:Fault>
                <faultcode>soap-env:Client.AuthenticationFailed</faultcode>
                <faultstring>Authentication failed</faultstring>
                <detail>
                    <StackTrace>com.sabre.universalservices.base.security.AuthenticationException: errors.authentication.USG_AUTHENTICATION_FAILED</StackTrace>
                </detail>
            </soap-env:Fault>
        </soap-env:Body>
    </soap-env:Envelope>

我找到了一种解决方案,即在响应中将 mustUnderstand 实例设置为 false,但我能够针对请求将 mustUnderstand 实例更改为 false,但我无法针对响应更改它

您应该在 getHeaders() 响应中添加 returns QName("http://www.ebxml.org/namespaces/messageHeader", "MessageHeader") 的 SOAPHandler。

一个例子是...

public class MessageHeaderHandler implements SOAPHandler<SOAPMessageContext>, Serializable {

    private static final long serialVersionUID = 1L;

    QName messageHeaderQName = new QName("http://www.ebxml.org/namespaces/messageHeader", "MessageHeader");
    Set<QName> headers = new HashSet<QName>();

    public MessageHeaderHandler() {
        headers.add(messageHeaderQName);
    }

    @Override
    public Set<QName> getHeaders() {
        return headers;
    }

    @Override
    public boolean handleMessage(SOAPMessageContext context) {
        return true;
    }

    @Override
    public boolean handleFault(SOAPMessageContext context) {
        return true;
    }

    @Override
    public void close(MessageContext context) {
    }
}

然后将其添加到处理程序链...

List<Handler> handlerChain = new ArrayList<Handler>();
handlerChain.add(new MessageHeaderHandler());
BindingProvider bindingProvider = // get the binding provider depending on your client;
bindingProvider.getBinding().setHandlerChain(this.handlerChain);

下面 link 中的解决方案在稍作更改后有效。

我补充说: headerBlock.setProcessed(); 后 headerBlock.setMustUnderstand(假);