我真的被SOAP服务响应的解组问题所困扰。我使用springboot应用程序和WebServiceTemplate来调用现有的SOAP服务。我使用下面的代码为编组和webservicetemplate设置bean。任何帮助都非常感谢。
在致电webServiceTemplate.marshalSendAndReceive(request);
时,我期待TravelResponse object
,但它正在给我JAXBElement<TravelResponse> object
作为回复。我需要帮助才能理解
1)为什么它给出了上述响应而不是TravelResponse
2)如何转换为TravelResponse
以下代码段:
@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;
}
答案 0 :(得分:2)
根据Spring的doc,WebServiceTemplate.marshalSendAndReceive(Object requestPayload)
发送包含给定有效内容的Web服务消息,由配置的Marshaller编组。 返回响应消息的解组有效负载(如果有)。 这只适用于指定的默认uri!
因此,您可以执行此操作以返回预期的响应。
JAXBElement<TravelResponse> res = (JAXBElement<TravelResponse>) webServiceTemplate.marshalSendAndReceive(request);
return res.getValue();
答案 1 :(得分:0)
尝试使用JaxbIntrospector.getValue从JAXB元素获取实际响应。
TravelResponse响应= JaxbIntrospector.getValue(jaxbElement);