Springboot SOAP服务解组问题与WebServiceTemplate的响应有关

时间:2017-08-10 07:45:51

标签: web-services spring-boot soap

我真的被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;
}

2 个答案:

答案 0 :(得分:2)

根据Spring的docWebServiceTemplate.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);