2011-12-15 21 views
5

Tôi đang làm việc trên các dịch vụ web mùa xuân. Tôi cần thêm một số yếu tố tùy chỉnh trong request và response message.which sẽ trông như thế này:Cách đọc thông tin Tiêu đề SOAP từ yêu cầu và thêm nó vào phản hồi trong các dịch vụ web mùa xuân

<soapenv:Envelope> 
    <soapenv:Header> 
     <tid:SplsTID> 
     <tid:Trantype>123</tid:Trantype> 
     <tid:Tranver>234</tid:Tranver> 
     </tid:SplsTID> 
    </soapenv:Header> 
    <soapenv:Body> 
     <get:GetOrderNumberRequest LoggingLevel="REGULAR" MonitorFlag="Y"> 
     <get:Header> 
      <get:TransactionId>111</get:TransactionId> 
      <get:SourceSystemId>SOMS</get:SourceSystemId> 
      <get:DateTime>2011-11-11T11:11:11</get:DateTime> 
     </get:Header> 
     <get:Body> 
      <get:StaplesOrderNumber RangeFlag="N" ReleaseFlag="N"> 
       <get:OrderNumber Count="1" End="11" Start="9"/> 
      </get:StaplesOrderNumber> 
     </get:Body> 
     </get:GetOrderNumberRequest> 
    </soapenv:Body> 
</soapenv:Envelope> 

i am có thể nối thêm <tid:SplsTID> dưới <soapenv:Header> trong yêu cầu bằng cách sửa đổi các tập tin WSDL. mà trông như thế này:

<wsdl:message name="GetOrderNumberRequest"> 
     <wsdl:part element="tns:GetOrderNumberRequest" name="GetOrderNumberRequest"> 
     </wsdl:part> 
     <wsdl:part element="sch1:SplsTID" name="SplsTID"> 
     </wsdl:part> 
    </wsdl:message> 
    <wsdl:message name="GetOrderNumberResponse"> 
     <wsdl:part element="tns:GetOrderNumberResponse" name="GetOrderNumberResponse"> 
     </wsdl:part> 
     <wsdl:part element="sch1:SplsTID" name="SplsTID"> 
     </wsdl:part> 
    </wsdl:message> 
    <wsdl:portType name="ONAS"> 
     <wsdl:operation name="GetOrderNumber"> 
      <wsdl:input message="tns:GetOrderNumberRequest" name="GetOrderNumberRequest"> 
      </wsdl:input> 
      <wsdl:output message="tns:GetOrderNumberResponse" name="GetOrderNumberResponse"> 
      </wsdl:output> 
     </wsdl:operation> 
    </wsdl:portType> 

Vấn đề là, tôi muốn đọc <tid:SplsTID> phần từ yêu cầu và muốn gắn nó dưới phần tiêu đề xà phòng của phản ứng, mà không xảy ra. tôi đang sử dụng điểm cuối dựa trên chú thích. mã sẽ đọc tiêu đề xà phòng là gì và sẽ nối thêm vào trong câu trả lời.

hiện lớp điểm cuối của tôi là:

@Endpoint 
public class OrderNumberServiceEndPoint { 
    public static final String NAMESPACE_URI = "http://schemas.staples.com/onas/getOrderNumber"; 

    /** 
    * The local name of the expected request. 
    */ 
    public static final String REQUEST_LOCAL_NAME = "GetOrderNumberRequest"; 

    /** 
    * The local name of the created response. 
    */ 
    public static final String RESPONSE_LOCAL_NAME = "GetOrderNumberResponse"; 

    private GetOrderNumberService getOrderNumberService; 

    public void setGetOrderNumberService(
      GetOrderNumberService getOrderNumberService) { 
     this.getOrderNumberService = getOrderNumberService; 
    } 

    @PayloadRoot(localPart = REQUEST_LOCAL_NAME, namespace = NAMESPACE_URI) 
    public GetOrderNumberResponse processOrderNumberRequest(
      GetOrderNumberRequest request) throws Exception { 
     GetOrderNumberResponse response = null; 
     try{ 
     response = getOrderNumberService.executeRequest(request); 
     }catch(CannotCreateTransactionException e){ 
      logger.error(ErrorConstants.ERROR_E17); 
      throw new ServiceException(ErrorConstants.ERROR_E17); 
     } 
     return response; 
    } 

} 

Hãy cho tôi biết nếu có nhiều chi tiết được yêu cầu. Bất kỳ trợ giúp sẽ được đánh giá cao.

Trả lời

3

Đây có lẽ chỉ là một nửa câu trả lời bạn cần nhưng tôi nghĩ bạn có thể đọc soapheaders bởi nhận được (Saaj) SoapMessage từ messagecontext, như thế này:

@PayloadRoot(
    localPart = "GetHiredCandidatesRequest", 
    namespace = DEFAULT_NAMESPACE 
) 
@ResponsePayload 
public GetHiredCandidatesResponse getKandidaat (
    @RequestPayload GetHiredCandidatesRequest getCandidate, 
    MessageContext messageContext) { 

    SaajSoapMessage request = (SaajSoapMessage) messageContext.getRequest(); 
    SoapHeader header = request.getSoapHeader(); 

    GetHiredCandidatesResponse response = objectFactory.createGetHiredCandidatesResponse(); 
    response.getCandidate().addAll(
     candidateService.getHiredCandidates(
      getCandidate.getFrom(), 
      getCandidate.getTo() 
     ) 
    ); 

    return response; 
} 

Kể từ phiên bản 2, bạn có thể tự động 'thêm 'một số đối tượng cho chữ ký của phương thức của bạn, như tôi thêm MessageContext vào đây. Tôi đã sử dụng điều này để có được các tập tin đính kèm từ một tin nhắn xà phòng chẳng hạn. Có thể bạn cũng có thể sử dụng các lớp con khác của AbstractSoapMessage vì phương thức getSoapHeder nằm trong lớp đó.

[sửa] BTW: Có lẽ bạn cũng có thể sử dụng Bộ chặn cũng vì yêu cầu/phản hồi được cung cấp ở đó. Hãy xem gói org.springframework.ws.soap.server.endpoint.interceptor cho một số ví dụ mặc định. [/ edit]

+0

tôi đã gọi tài liệu về mùa xuân [link] (http://static.springsource.org/spring-ws/site/reference/html/server.html) .i đã thành công trong việc đọc tiêu đề SOAP bên trong method.i của tôi đã thay đổi phương thức lớp endpoint của tôi như thế này: '@PayloadRoot (localPart = REQUEST_LOCAL_NAME, namespace = NAMESPACE_URI) @ResponsePayload quy trình SaajSoapMessage công khaiOrderNumberRequest (@RequestPayload GetOrderNumberYêu cầu yêu cầu, tiêu đề SoapHeader) '.now nó ném lỗi' java.lang.IllegalStateException: Không có adapter cho điểm cuối' bởi vì tôi đã thay đổi kiểu trả về của phương thức thành 'SaajSoapMessage' từ' GetOrderNumberResponse'. didnt work –

+0

Tôi nghĩ bạn không thể sử dụng 'SaajSoapMessage' làm kiểu trả về. Bạn có thể cần sử dụng 'GetOrderNumberResponse' để khớp với WSDL của bạn. Trong ví dụ của tôi, tôi nhận được yêu cầu từ 'MessageContext' nhưng bạn cũng có thể nhận được đối tượng phản hồi và có thể đặt một số tiêu đề xà phòng ở đó. – evandongen

+0

Trong ví dụ của bạn, kiểu trả về của phương thức là 'Response'. Đó có phải là phần PayLoad của thông báo phản hồi không? Tôi tự hỏi liệu chúng ta có trả về phần Payload của phản hồi vốn thực sự nằm trong phần Soap Body, sau đó phần header sẽ được thêm vào trong phản hồi như thế nào? Hơn nữa không nhận được bất kỳ mã làm việc nào giải quyết yêu cầu này. Tôi không muốn làm bất cứ điều gì với phần tiêu đề, bất cứ điều gì đến trong yêu cầu chỉ gửi như nó là trong phản ứng. logic chỉ để tính phần tải trọng của cơ thể. Nó có vẻ rất yêu cầu chung cho các dịch vụ web nhưng rất kém tài liệu cho springWS. –

11

Cuối cùng tôi đã thành công trong việc đọc tiêu đề xà phòng từ yêu cầu và nối thêm vào phản hồi. Đây là cách phương thức điểm đến của tôi trông giống như bây giờ:

@PayloadRoot(localPart = REQUEST_LOCAL_NAME, namespace = NAMESPACE_URI) 
    @ResponsePayload 
    public GetOrderNumberResponse processOrderNumberRequest(
      @RequestPayload GetOrderNumberRequest request, 
      MessageContext messageContext) throws Exception { 
     logger.info("Request Received"); 
     // read SOAP Header from request and append in response 
     SaajSoapMessage soapRequest = (SaajSoapMessage) messageContext 
       .getRequest(); 
     SoapHeader reqheader = soapRequest.getSoapHeader(); 
     SaajSoapMessage soapResponse = (SaajSoapMessage) messageContext 
       .getResponse(); 
     SoapHeader respheader = soapResponse.getSoapHeader(); 
     TransformerFactory transformerFactory = TransformerFactory 
       .newInstance(); 
     Transformer transformer = transformerFactory.newTransformer(); 
     Iterator<SoapHeaderElement> itr = reqheader.examineAllHeaderElements(); 
     while (itr.hasNext()) { 
      SoapHeaderElement ele = itr.next(); 
      transformer.transform(ele.getSource(), respheader.getResult()); 
     } 
     // process the request PayLoad 
     GetOrderNumberResponse response = null; 
     try { 
      response = getOrderNumberService.executeRequest(request); 
     } catch (CannotCreateTransactionException e) { 
      logger.error(ErrorConstants.ERROR_E17); 
      throw new ServiceException(ErrorConstants.ERROR_E17); 
     } 
     logger.info("Response Sent"); 
     return response; 
    } 
+0

Tôi rất vui vì bạn đã tìm ra dựa trên những gì tôi đã đăng. Tôi đồng ý với bạn thật khó để tìm ra tất cả (giống như khi sử dụng các tệp đính kèm SOAP chẳng hạn). – evandongen

+0

Đây có phải là không sử dụng tệp đính kèm SOAP không? – ziggy

+0

Tôi đang đối mặt với cùng một vấn đề, vì vậy tôi rất vui khi thấy giải pháp của bạn, tôi sẽ thử nó vào ngày mai. Cảm ơn bạn. – anhtuangv