【问题标题】:Spring ClientInterceptor shows empty SOAP header in responseSpring ClientInterceptor 在响应中显示空的 SOAP 标头
【发布时间】:2014-11-11 14:40:16
【问题描述】:

我有一个需要与之交谈的 SOAP 服务。第一个 SOAP 请求在 SOAP 标头中收到带有 sessionID 元素的响应,我需要在最终发布命令中发送该响应。

为了获取这个 sessionID 值,我计划使用 ClientInterceptor。在我的 WebServiceGatewaySupport 实现中,我注册了我的拦截器:

this.setInterceptors(new ClientInterceptor[] { new MyWebServiceClientInterceptor() });

我的拦截器:

public class MyWebServiceClientInterceptor implements ClientInterceptor {

    public final QName SessionID_QNAME = new QName("http://xml.example.com/ws/session", "sessionID");

    public boolean handleFault(MessageContext context) throws WebServiceClientException {
        logger.info("Handle Fault");
        return true;
    }       

    public boolean handleResponse(MessageContext context) throws WebServiceClientException {
        logger.info("Handle Response");
        SoapMessage soapMessage = (SoapMessage) context.getRequest();
        SoapHeader soapHeader = soapMessage.getSoapHeader();

        logger.info("Response Header: " + soapHeader.getName());
        Iterator<SoapHeaderElement> qn = soapHeader.examineAllHeaderElements();
        while (qn.hasNext()) {
            SoapElement elem = qn.next();
            logger.info(elem.toString());
        }
        Iterator<QName> an = soapHeader.getAllAttributes();
        while (an.hasNext()) {
            QName elem = an.next();
            logger.info(elem.toString());
        }
        return true;
    }

    public boolean handleRequest(MessageContext context) throws WebServiceClientException {
        logger.info("Handle Request");
        return true;
    }
}

但是,我不断返回一个空的 SOAP 标头。我正在运行 Wireshark,并且可以清楚地看到返回的 SOAP 数据包中的 sessionID 令牌,因此不知道发生了什么。有什么想法吗?

【问题讨论】:

  • 是Soap头还是Http头?不同的东西...

标签: java spring web-services soap interceptor


【解决方案1】:

我是个白痴。 '这是一个错字。我需要打电话:

SoapMessage soapMessage = (SoapMessage) context.getResponse();

不是:

SoapMessage soapMessage = (SoapMessage) context.getRequest();

对于那些想要在请求中设置标头并在响应中接收标头的人的完整代码:

ClientInterceptor 接收自定义 SOAP 标头值:

public class MyWebServiceClientInterceptor implements ClientInterceptor {

    public boolean handleFault(MessageContext context) throws WebServiceClientException {
        return true;
    }

    public boolean handleResponse(MessageContext context) throws WebServiceClientException {
        SoapMessage soapMessage = (SoapMessage) context.getResponse();
        SoapHeader soapHeader = soapMessage.getSoapHeader();

        Iterator<SoapHeaderElement> qn = soapHeader.examineHeaderElements(MY_SESSIONID_QNAME);

        while (qn.hasNext()) {
            SoapElement elem = qn.next();
            SoapHeaderElement headerElem = (SoapHeaderElement) elem;
            if (StringUtil.validString(headerElem.getText())) {
                if (!headerElem.getText().equals(sessionId)) {
                    sessionId = headerElem.getText();
                    logger.info("Bound to Session ID: " + sessionId);
                }
            }
        }
        return true;
    }

    public boolean handleRequest(MessageContext context) throws WebServiceClientException {
        return true;
    }
}

我使用拦截器的地方:

public class MySoapClient extends WebServiceGatewaySupport {

public MySoapClient() {
    this.setInterceptors(new ClientInterceptor[] { new MyWebServiceClientInterceptor() });
    ...
}

...
}

回调设置自定义 SOAP 标头: 类 MySoapActionCallback 实现 WebServiceMessageCallback {

    public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException {
        SaajSoapMessage soapMessage = (SaajSoapMessage) message;
        SoapHeaderElement messageId = soapMessage.getSoapHeader().addHeaderElement(SessionID_QNAME);
        if (StringUtil.validString(sessionId)) {
            messageId.setText(sessionId);
        }
    }
}

我在哪里使用回调:

JAXBElement<ReturnType> result = (JAXBElement<ReturnType>) getWebServiceTemplate().marshalSendAndReceive(of.createRelease(null), new MySoapActionCallback());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多