2012-07-24 15 views
5

Tôi gặp khó khăn khi gọi một Web SOAP 1.2 WebService thông qua Spring-ws WebServiceTemplate. Yêu cầu được thực hiện là thiếu SOAPAction trong Http Header và máy chủ ném một lỗi với "Không thể xử lý yêu cầu mà không có tham số hành động hợp lệ. Vui lòng cung cấp một hành động xà phòng hợp lệ." Tôi đã có thể tìm ra hành động SOAP bị thiếu bằng cách giám sát thông qua wireshark. Tôi cũng không đứng sau bất kỳ proxy nào.Spring WebServiceTemplate SOAPAction bị thiếu trong Tiêu đề HTTP

Tôi đã đảm bảo rằng XML SOAP mà tôi đang cố gắng gửi là hợp lệ bằng cách chạy yêu cầu qua TCP Mon (công cụ như SOAP UI) và có thể nhận phản hồi.

Dưới đây là cấu hình mùa xuân của tôi:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
xmlns:util="http://www.springframework.org/schema/util" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
         http://www.springframework.org/schema/util 
         http://www.springframework.org/schema/util/spring-util-3.0.xsd"> 

<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory"> 
    <property name="soapVersion"> 
    <util:constant static-field="org.springframework.ws.soap.SoapVersion.SOAP_12" /> 
    </property> 
</bean> 

<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate"> 
<constructor-arg ref="messageFactory" /> 
<property name="defaultUri" value="https://ecomapi.networksolutions.com/soapservice.asmx" /> 
<property name="messageSender"> 
    <bean class="org.springframework.ws.transport.http.CommonsHttpMessageSender" />  </property> 
</bean> 

Và đây là mã java của tôi:

  public void simpleSendAndReceive() { 
      try{ 
      StreamSource source = new StreamSource(new StringReader(MESSAGE)); 
      StreamResult result = new StreamResult(System.out); 
      SoapActionCallback actionCallBack = new SoapActionCallback("https://ecomapi.networksolutions.com/soapservice.asmx") { 
       public void doWithMessage(WebServiceMessage msg) { 
        SoapMessage smsg = (SoapMessage)msg; 
        smsg.setSoapAction("http://networksolutions.com/ReadOrder"); 
       } 
      }; 
      webServiceTemplate.sendSourceAndReceiveToResult(
        "https://ecomapi.networksolutions.com/soapservice.asmx", 
        source, 
        new SoapActionCallback("http://networksolutions.com/ReadOrder"), 
    //      actionCallBack, 
        result); 


      System.out.println(source.getInputStream().toString()); 
      System.out.println(result.getWriter().toString()); 

      }catch (SoapFaultClientException e) { 
       System.out.println(e.getFaultCode()); 
       System.out.println(e.getFaultStringOrReason()); 
       System.out.println(e.fillInStackTrace().getLocalizedMessage()); 
      } catch (WebServiceIOException we) { 
       System.out.println(we.getRootCause()); 
      } 
     } 
+0

Dường như bạn đang đặt tiêu đề Hành động SOAP theo nhiều cách ở đây đúng - sử dụng 'actionCallBack', sử dụng' SoapActionCallback..' mới, cả hai cách tiếp cận không hoạt động? –

+0

Thats chính xác. Cả hai cách tiếp cận đều cho cùng một lỗi. – user1546703

+0

Bạn yêu cầu tiêu đề 'http: // networksolutions.com/ReadOrder' ngay - bạn sẽ thấy tiêu đề nào trên dây bằng cách sử dụng công cụ Wireshark. Chỉ muốn đảm bảo rằng bạn không gửi 'https: // ecomapi.networksolutions.com/soapservice.asmx'. Đây là một công cụ đơn giản để nắm bắt những gì đang diễn ra - http://sourceforge.net/projects/nettool/ –

Trả lời

1

tôi phải đối mặt với cùng một vấn đề và tôi bắt nguồn từ nó trở lại một lỗi trong 1.3.2 Phiên bản triển khai com.sun.xml.messaging.saaj.soap.MessageImpl (http://java.net/jira/browse/SAAJ-37). Tôi đã nâng cấp lên phiên bản 1.3.19 và tất cả đều ổn.

Vấn đề: -

Trước khi viết yêu cầu đến dòng đầu ra, các SaveChanges() phương pháp được gọi. Phiên bản 1.3.2 của lớp này đã ghi đè tiêu đề yêu cầu 'Content-Type' trong việc thực thi phương thức 'saveChanges'.

0

Tôi đã gặp sự cố tương tự do không gian tên của chú thích XmlSchema trong tệp package-info.java khác với dịch vụ xà phòng mà tôi đang cố gắng gọi. Điều này dẫn đến việc tôi sử dụng xjc để tạo ra các yêu cầu jaxb và các đối tượng phản hồi từ một xsd mà tôi đã khâu lại với nhau từ các phần wsdl cộng với tiêu đề xsd từ một dịch vụ trước đó mà tôi đã giao tiếp để nó là một lỗi cắt và dán thuần túy câu trả lời trước đây ở đây về không gian tên là điều khiến tôi gặp lỗi của tôi một cách nhanh chóng.

0

Hành động SOAP chỉ bắt buộc trong SOAP 1.1, xem section Content Type.

Tiêu đề SOAPAction HTTP bắt buộc SOAP 1.1 đã bị xóa trong SOAP 1.2. Ở vị trí của nó là một tham số hành động tùy chọn trên loại phương tiện/loại xà phòng + xml.