Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring ClientInterceptor在响应中显示空SOAP头_Java_Spring_Web Services_Soap_Interceptor - Fatal编程技术网

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

Java Spring ClientInterceptor在响应中显示空SOAP头,java,spring,web-services,soap,interceptor,Java,Spring,Web Services,Soap,Interceptor,我有一个SOAP服务,我需要与之交谈。第一个SOAP请求接收SOAP头中带有sessionID元素的响应,我需要在最终发布命令中发送该元素 为了获取这个sessionID值,我计划使用ClientInterceptor。在我的WebServiceGatewaySupport实现中,我注册了我的拦截器: this.setInterceptors(new ClientInterceptor[] { new MyWebServiceClientInterceptor() }); public cla

我有一个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;
    }
}
public class MySoapClient extends WebServiceGatewaySupport {

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

...
}
我的拦截器:

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;
    }
}
public class MySoapClient extends WebServiceGatewaySupport {

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

...
}
公共类MyWebServiceClient接收器实现ClientInterceptor{
公共最终QName会话ID_QName=新QName(“http://xml.example.com/ws/session“,“sessionID”);
公共布尔handleFault(MessageContext上下文)引发WebServiceClientException{
logger.info(“处理故障”);
返回true;
}       
公共布尔HandlerResponse(MessageContext上下文)引发WebServiceClientException{
logger.info(“句柄响应”);
SoapMessage SoapMessage=(SoapMessage)context.getRequest();
SoapHeader SoapHeader=soapMessage.getSoapHeader();
logger.info(“响应头:”+soapHeader.getName());
迭代器qn=soapHeader.TesteallHeaderElements();
while(qn.hasNext()){
SoapElement elem=qn.next();
logger.info(elem.toString());
}
迭代器an=soapHeader.getAllAttributes();
while(an.hasNext()){
QName elem=an.next();
logger.info(elem.toString());
}
返回true;
}
公共布尔HandlerRequest(MessageContext上下文)引发WebServiceClientException{
logger.info(“处理请求”);
返回true;
}
}

然而,我总是得到一个空的SOAP头。我正在运行Wireshark,可以清楚地看到返回的SOAP数据包中的sessionID令牌,因此对于正在发生的事情一无所知。有什么想法吗?

我是个白痴。”这是个打字错误。我需要打电话:

SoapMessage soapMessage = (SoapMessage) context.getResponse();
不是:

针对那些希望在请求上设置标题并在响应上接收标题的人的完整代码:

用于接收自定义SOAP头值的ClientInterceptor:

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;
    }
}
设置自定义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());
JAXBElement结果=(JAXBElement)getWebServiceTemplate().marshalSendAndReceive(of.createRelease(null),new MySoapActionCallback());

它是Soap头还是Http头?不同的东西。。。