简体   繁体   English

Spring ClientInterceptor在响应中显示空SOAP标头

[英]Spring ClientInterceptor shows empty SOAP header in response

I have a SOAP service which I need to talk to. 我有一个SOAP服务,我需要与之交谈。 The first SOAP request receives a response with a sessionID element in the SOAP header which I need to send in the final release command. 第一个SOAP请求接收带有SOAP标头中的sessionID元素的响应,我需要在最终发布命令中发送该响应。

To grab this sessionID value I plan on using a ClientInterceptor . 要获取此sessionID值,我计划使用ClientInterceptor In my implementation of WebServiceGatewaySupport I register my interceptor: 在我的WebServiceGatewaySupport实现中,我注册了我的拦截器:

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

My Interceptor: 我的拦截器:

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

However I keep getting back an empty SOAP header. 但是我一直在回到一个空的SOAP标头。 I'm running Wireshark and can clearly see the sessionID token in the returned SOAP packet so at a lost as to what's going on. 我正在运行Wireshark并且可以清楚地看到返回的SOAP数据包中的sessionID令牌,因此丢失了所发生的事情。 Any ideas? 有任何想法吗?

I'm an idiot. 我是个白痴。 'Twas a typo. '这是一个错字。 I needed to call: 我需要打电话:

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

Not: 不:

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

Full code for those wanting to set headers on requests and receive headers on responses: 想要在请求上设置标头并在响应上接收标头的人的完整代码:

ClientInterceptor to receive custom SOAP header values: 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;
    }
}

Where I use the interceptor: 我在哪里使用拦截器:

public class MySoapClient extends WebServiceGatewaySupport {

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

...
}

Callback to set custom SOAP Header: class MySoapActionCallback implements WebServiceMessageCallback { 回调以设置自定义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);
        }
    }
}

Where I use the callback: 我在哪里使用回调:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM