Springboot SOAP service unmarshalling Issue with the response from WebServiceTemplate


Springboot SOAP service unmarshalling Issue with the response from WebServiceTemplate



I am really bugged with an unmarshalling issue with the response from the SOAP service. I am using springboot application and WebServiceTemplate for calling an existing SOAP service. I am using below code to set up beans for marshalling and webservicetemplate. Any help is highly appreciated.



On calling webServiceTemplate.marshalSendAndReceive(request); I am expecting TravelResponse object but it is giving me JAXBElement<TravelResponse> object as response. I need help to understand
1) why is it giving above response instead of TravelResponse
2) How to convert to TravelResponse


webServiceTemplate.marshalSendAndReceive(request);


TravelResponse object


JAXBElement<TravelResponse> object


TravelResponse


TravelResponse



Code snippet below:


@Bean
Jaxb2Marshaller jaxb2Marshaller() {
Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
jaxb2Marshaller.setContextPath("com.cater.trip.simple_api.trip.v1");
return jaxb2Marshaller;
}

@Bean
public WebServiceTemplate webServiceTemplate() throws Exception {
WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
webServiceTemplate.setMessageFactory(getMessageFactory());
webServiceTemplate.setMarshaller(jaxb2Marshaller());
webServiceTemplate.setUnmarshaller(jaxb2Marshaller());
webServiceTemplate.setDefaultUri(defaultUri);
webServiceTemplate.setMessageSender(getMessageSender());
return webServiceTemplate;
}

@Bean
public SaajSoapMessageFactory getMessageFactory() {
return new SaajSoapMessageFactory();
}

@Bean
public HttpComponentsMessageSender getMessageSender() {
return new HttpComponentsMessageSender();
}


@Override
public Object getData( ) {
ObjectFactory clientFac = new ObjectFactory();
TravelRequest request = populateRequest(clientFac);
TravelResponse res = (TravelResponse) webServiceTemplate.marshalSendAndReceive(request);
return res;
}




2 Answers
2



As per Spring's documentation, WebServiceTemplate.marshalSendAndReceive() returns non-unmarshalled response.


WebServiceTemplate.marshalSendAndReceive()



So, you can do this to return the expected response.


JAXBElement<TravelResponse> res = (JAXBElement<TravelResponse>) webServiceTemplate.marshalSendAndReceive(request);

return res.getValue();



Try JaxbIntrospector.getValue to get the actual response from JAXB element.



TravelResponse response = JaxbIntrospector.getValue(jaxbElement);






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Popular posts from this blog

List of Kim Possible characters

Audio Livestreaming with Python & Flask

NSwag: Generate C# Client from multiple Versions of an API