Spring WS - Пример запроса заголовка / полезной нагрузки и ответа заголовка / полезной нагрузки - PullRequest
0 голосов
/ 30 октября 2018

Мне необходимо разработать веб-сервис с использованием Spring Framework. Сценарий таков:

Моя программа отправит SOAP-запрос (заголовок + полезная нагрузка) службе и ожидает ответ (заголовок + полезная нагрузка) обратно от службы. И полезная нагрузка, и заголовок важны и необходимы программе.

Проблема в том, что я не могу найти ни одного примера в Spring WS, где заголовок и полезная нагрузка отправляются как часть запроса, а заголовок и полезная нагрузка извлекаются из ответа.

Я использую WebServiceGatewaySupport и WebServiceTemplate для отправки запроса и получения ответа.

WebServiceTemplate предоставляет 2 способа отправки запроса:

  • marshalSendAndReceive
  • sendAndReceive

Проблема с marshalSendAndReceive заключается в том, что я не верну заголовок ответа, хотя могу отправить заголовок запроса.

Проблема с sendAndReceive заключается в том, что я не смогу отправить заголовок запроса, хотя смогу извлечь заголовок ответа.

Единственное решение, доступное в настоящее время в настоящее время, заключается в использовании перехватчиков, но кажется, что это неправильный способ обработки заголовков, поскольку заголовок перехватывается до того, как он достигает вызывающей функции. Чтобы у вызывающей функции был доступ к заголовку ответа, нам нужно сделать Interceptor с состоянием, что нежелательно.

Я буду очень признателен за руководство и помощь любого, кто может дать мне пример того, как правильно этого добиться.

Пожалуйста, найдите мой код ниже при использовании sendAndReceive:

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

Приведенный выше код всегда возвращает ноль для заголовка ответа.

1 Ответ

0 голосов
/ 11 ноября 2018

Я решил проблему. Я могу отправить SOAP-заголовок в сервис и также извлечь заголовок ответа из ответа. Нет необходимости в перехватчиках.

Основная помощь была из сообщения в блоге Андреаса Вейтен. Спасибо.

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