Мне необходимо разработать веб-сервис с использованием 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;
}
}
Приведенный выше код всегда возвращает ноль для заголовка ответа.