【问题标题】:Springboot SOAP service unmarshalling Issue with the response from WebServiceTemplate来自 WebServiceTemplate 的响应的 Springboot SOAP 服务解组问题
【发布时间】:2017-08-10 07:45:50
【问题描述】:

我真的对来自 SOAP 服务的响应的解组问题感到困惑。我正在使用 springboot 应用程序和 WebServiceTemplate 来调用现有的 SOAP 服务。我正在使用下面的代码来设置用于编组和 webservicetemplate 的 bean。非常感谢任何帮助。

致电webServiceTemplate.marshalSendAndReceive(request); 我期待TravelResponse object 但它给了我JAXBElement<TravelResponse> object 作为回应。我需要帮助才能理解
1)为什么它给出上述响应而不是TravelResponse 2) 如何转换成TravelResponse

下面的代码sn-p:

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

【问题讨论】:

    标签: web-services spring-boot soap


    【解决方案1】:

    根据 Spring 的docWebServiceTemplate.marshalSendAndReceive(Object requestPayload)

    发送包含给定负载的 Web 服务消息,由配置的 Marshaller 编组。 返回响应消息的未编组负载(如果有)。 这仅适用于指定的默认 uri!

    因此,您可以这样做以返回预期的响应。

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

    【讨论】:

    • 请链接到文档!
    【解决方案2】:

    尝试 JaxbIntrospector.getValue 从 JAXB 元素获取实际响应。

    TravelResponse 响应 = JaxbIntrospector.getValue(jaxbElement);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-17
      • 2012-07-29
      • 2020-02-24
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 2018-03-22
      • 1970-01-01
      相关资源
      最近更新 更多