SpringWS-查找请求头/负载和响应头/负载示例

SpringWS-查找请求头/负载和响应头/负载示例,spring,web-services,soap,spring-ws,webservicetemplate,Spring,Web Services,Soap,Spring Ws,Webservicetemplate,我被要求使用Spring框架开发Web服务。 场景如下: 我的程序将向服务发送一个SOAP请求(报头+有效负载),并期望服务返回一个响应(报头+有效负载)。 有效载荷和头部都很重要,并且是程序所需要的 问题是,我在SpringWS中找不到任何示例,其中头和有效负载都作为请求的一部分发送,头和有效负载从响应中提取 我正在使用WebServiceGatewaySupport和WebServiceTemplate发送请求和获取响应 WebServiceTemplate提供了两种发送请求的方法: ma

我被要求使用Spring框架开发Web服务。 场景如下:

我的程序将向服务发送一个SOAP请求(报头+有效负载),并期望服务返回一个响应(报头+有效负载)。 有效载荷和头部都很重要,并且是程序所需要的

问题是,我在SpringWS中找不到任何示例,其中头和有效负载都作为请求的一部分发送,头和有效负载从响应中提取

我正在使用
WebServiceGatewaySupport
WebServiceTemplate
发送请求和获取响应

WebServiceTemplate
提供了两种发送请求的方法:

  • marshalSendAndReceive
  • send和receive
MarshalSendReceive
的问题是,尽管我可以发送请求头,但我不会返回响应头

sendandereceive
的问题是,虽然我可以提取响应头,但我将无法发送请求头

目前唯一可用的解决方案是使用拦截器,但这似乎不是处理头的正确方法,因为头在到达调用函数之前就被截获了。为了让调用函数访问响应头,我们需要将拦截器设置为有状态,这是不可取的

我将非常感谢任何人的指导和帮助,他们可以为我提供一个如何正确实现这一目标的例子

使用SendReceive时,请在下面查找我的代码:

public class ClientAccountInformation extends WebServiceGatewaySupport {

    public ClientAccountInformation() {
    }

    public FIGetAcctsInfoCallBackRs sendRequest(GetAcctInfoRq request, HeaderRq headerRq) {

        WebServiceTemplate webServiceTemplate =  getWebServiceTemplate();
        try {
            ResponseAndHeader responseAndHeader = webServiceTemplate.sendAndReceive(Constants.WEBSERVICE_URL, 
                new WebServiceMessageCallback() {
                  public void doWithMessage(WebServiceMessage message) throws IOException {
                      try {
                          Jaxb2Marshaller marshallerRq = new Jaxb2Marshaller();
                          marshallerRq.setContextPath("com.abc.domain..getacctinfo");

                          marshallerRq.afterPropertiesSet();

                          MarshallingUtils.marshal(marshallerRq, request, message);

                          SoapHeader soapHeader = ((SoapMessage)message).getSoapHeader();
                          JAXBContext context = JAXBContext.newInstance(HeaderRq.class);
                          Marshaller marshaller = context.createMarshaller();
                          marshaller.marshal(HeaderRq, soapHeader.getResult());
                      } catch (Exception e) {
                          e.printStackTrace();
                      }
                  }
                },
                new WebServiceMessageExtractor<ResponseAndHeader>() {
                  public ResponseAndHeader extractData(WebServiceMessage message) throws IOException {
                    SoapHeader header = ((SoapMessage)message).getSoapHeader();
                    Iterator<SoapHeaderElement> it = header.examineHeaderElements(new QName("urn:test", "HeaderRs"));
                    return new ResponseAndHeader(
                        it.hasNext() ? (HeaderRs)jaxb2Marshaller().unmarshal(it.next().getSource())
                                     : null,
                        (GetAcctInfoRs) MarshallingUtils.unmarshal(jaxb2Marshaller(), message));
                  }
                });

            return null;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    Jaxb2Marshaller jaxb2Marshaller() {
        Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
        jaxb2Marshaller.setContextPath("com.abc.domain.getacctinfo");

        return jaxb2Marshaller;
    }
}
公共类客户端帐户信息扩展了WebServiceGatewaySupport{
公共客户帐户信息(){
}
public FiGetAcctInFocalBackers发送请求(GetAcctInfoRq请求,HeaderRq HeaderRq){
WebServiceTemplate WebServiceTemplate=getWebServiceTemplate();
试一试{
ResponseAndHeader ResponseAndHeader=webServiceTemplate.sendAndReceive(Constants.WEBSERVICE\u URL,
新的WebServiceMessageCallback(){
public void doWithMessage(WebServiceMessage消息)引发IOException{
试一试{
Jaxb2Marshaller marshallerRq=新的Jaxb2Marshaller();
marshallerq.setContextPath(“com.abc.domain..getacctinfo”);
Marshallerq.AfterPropertieSet();
marshallLingutils.marshall(marshalllerrq、请求、消息);
SoapHeader SoapHeader=((SoapMessage)消息).getSoapHeader();
JAXBContext context=JAXBContext.newInstance(HeaderRq.class);
Marshaller=context.createMarshaller();
marshaller.marshall(HeaderRq,soapHeader.getResult());
}捕获(例外e){
e、 printStackTrace();
}
}
},
新的WebServiceMessageExtractor(){
公共响应Header extractData(WebServiceMessage消息)引发IOException{
SoapHeader头=((SoapMessage)消息).getSoapHeader();
迭代器it=header.examiceheaderElements(新的QName(“urn:test”、“HeaderRs”);
返回新的ResponseAndHeader(
it.hasNext()?(HeaderRs)jaxb2Marshaller().unmarshal(it.next().getSource())
:null,
(GetAcctInfoRs)MarshallingUtils.unmarshal(jaxb2Marshaller(),message));
}
});
返回null;
}捕获(例外e){
e、 printStackTrace();
返回null;
}
}
Jaxb2Marshaller Jaxb2Marshaller(){
Jaxb2Marshaller Jaxb2Marshaller=新的Jaxb2Marshaller();
jaxb2Marshaller.setContextPath(“com.abc.domain.getacctinfo”);
返回封送员;
}
}

上面的代码总是为响应头返回null。

我已经解决了这个问题。我可以将SOAP头发送到服务,并从响应中提取响应头。不需要拦截器

主要的帮助来自Andreas Veithen的博客文章。谢谢

public class ClientSamaAccountInformation extends WebServiceGatewaySupport {

    public ClientSamaAccountInformation() {
    }

    public FIGetAcctsInfoCallBackRs sendRequest(FIGetAcctsInfoCallBackRq request, MsgHdrRq msgHdrRq) {

        WebServiceTemplate webServiceTemplate =  getWebServiceTemplate();
        try {
            ResponseAndHeader responseAndHeader = webServiceTemplate.sendAndReceive(Constants.WEBSERVICE_URL, 
                new WebServiceMessageCallback() {
                  public void doWithMessage(WebServiceMessage message) throws IOException {
                      try {
                          Jaxb2Marshaller marshallerRq = new Jaxb2Marshaller();
                          marshallerRq.setContextPath("com.abc.domain..getacctinfo");

                          marshallerRq.afterPropertiesSet();

                          MarshallingUtils.marshal(marshallerRq, request, message);

                          SoapHeader soapHeader = ((SoapMessage)message).getSoapHeader();
                          JAXBContext context = JAXBContext.newInstance(MsgHdrRq.class);
                          Marshaller marshaller = context.createMarshaller();
                          marshaller.marshal(msgHdrRq, soapHeader.getResult());
                      } catch (Exception e) {
                          e.printStackTrace();
                      }
                  }
                },
                new WebServiceMessageExtractor<ResponseAndHeader>() {
                  public ResponseAndHeader extractData(WebServiceMessage message) throws IOException {

                    //Extract response payload
                    FIGetAcctsInfoCallBackRs response = null;
                    try {
                        Jaxb2Marshaller marshallerRs = new Jaxb2Marshaller();
                        marshallerRs.setContextPath("com.abc.domain..getacctinfo");
                        marshallerRs.afterPropertiesSet();
                        response = (FIGetAcctsInfoCallBackRs) MarshallingUtils.unmarshal(marshallerRs, message);

                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    //Extract response header
                    MsgHdrRs msgHdrRs = null;
                    try {
                        JAXBContext context = JAXBContext.newInstance(MsgHdrRs.class);
                        Unmarshaller unmarshaller = context.createUnmarshaller();

                        SoapHeader header = ((SoapMessage)message).getSoapHeader();
                        Iterator<SoapHeaderElement> it = header.examineHeaderElements(new QName("http://www.abc.def.com/common/Header", "MsgHdrRs"));
                        while(it.hasNext()) {
                            msgHdrRs = (MsgHdrRs) unmarshaller.unmarshal(it.next().getSource());
                            System.out.println(msgHdrRs);

                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    return null;
                  }
                });

            return null;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
public类ClientSamaAccountInformation扩展了webservicegateway支持{
公共客户端帐户信息(){
}
公共FIGETACCINSFOCALLBACKRS发送请求(FIGETACCINSFOCALLBACKRQ请求,MsgHdrRq MsgHdrRq){
WebServiceTemplate WebServiceTemplate=getWebServiceTemplate();
试一试{
ResponseAndHeader ResponseAndHeader=webServiceTemplate.sendAndReceive(Constants.WEBSERVICE\u URL,
新的WebServiceMessageCallback(){
public void doWithMessage(WebServiceMessage消息)引发IOException{
试一试{
Jaxb2Marshaller marshallerRq=新的Jaxb2Marshaller();
marshallerq.setContextPath(“com.abc.domain..getacctinfo”);
Marshallerq.AfterPropertieSet();
marshallLingutils.marshall(marshalllerrq、请求、消息);
SoapHeader SoapHeader=((SoapMessage)消息).getSoapHeader();
JAXBContext context=JAXBContext.newInstance(msghdrq.class);
Marshaller=context.createMarshaller();
marshaller.marshall(msgHdrRq,soapHeader.getResult());
}捕获(例外e){
e、 printStackTrace();
}
}
},
新的WebServiceMessageExtractor(){
公共响应Header extractData(WebServiceMessage消息)引发IOException{
//提取响应payloa