2012-12-17 26 views
5

Tôi đang gọi một webservice SOAP bằng cách sử dụng JAX WS 2.0. Trong trường hợp lỗi Tôi nhận được câu trả lời sau đây:SOAPFaultException.getFault(). GetDetail() là null

<?xml version="1.0"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2003/05/soap- envelope"> 
    <soap:Header/> 
    <soap:Body> 
     <soap:Fault xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2003/05/soap- envelope" xmlns:xml="http://www.w3.org/XML/1998/namespace"> 
      <soap:Code> 
       <soap:Value>soap:Receiver</soap:Value> 
      </soap:Code> 
      <soap:Reason> 
       <soap:Text xml:lang="en">Exception of type 'blah blah' was thrown. 
       </soap:Text> 
      </soap:Reason> 
      <soap:Node>{SOME URL}</soap:Node> 
      <detail> 
       <error>345</error> 
       <message>Cannot find user. Blah blah</message> 
      </detail> 
     </soap:Fault> 
    </soap:Body> 
</soap:Envelope> 

Như bạn có thể thấy lỗi hữu ích là trong nút chi tiết:

<soap:Envelope> 
    <soap:Body> 
     <soap:Fault> 
      <detail> 

trong khách hàng của tôi Tôi nhận được một SOAPFaultException trong đó có một Đối tượng SOAPFault. Đối tượng SOAPFault dường như thiếu nút tôi đã đăng ở trên. SOAPFaultException.getFault(). GetDetail() là null. Tuy nhiên, nó có tất cả các nút khác bao gồm cả xà phòng: Lý do. Bất kỳ ý tưởng tại sao nó thiếu nút chi tiết?

Cảm ơn.

Trả lời

3

Nó chỉ ra rằng các nút chi tiết cần phải bao gồm không gian tên SOAP là tốt. Vì vậy, nó cần phải được:

<soap:detail> 

Vì tôi không có quyền kiểm soát các dịch vụ web tôi quản lý để thực hiện thay đổi này trong phương pháp handleFault của một SOAPHandler tùy chỉnh tôi tiêm vào khách hàng của tôi. Sau thay đổi đó, chi tiết của lỗi không còn null và có tất cả các nút phụ.

Dựa trên, http://www.w3.org/TR/soap12-part1/#soapfault, tôi tin rằng nhà phát triển cần sửa phản hồi trong khi xảy ra lỗi.

0

Điều này làm việc cho tôi:

} catch (SoapFaultClientException e) { 
    log.error(e); 
    SoapFaultDetail soapFaultDetail = e.getSoapFault().getFaultDetail(); 
    SoapFaultDetailElement detailElementChild = (SoapFaultDetailElement) soapFaultDetail.getDetailEntries().next(); 
    Source detailSource = detailElementChild.getSource(); 

    try { 
     Object detail = (JAXBElement<SearchResponse>) getWebServiceTemplate().getUnmarshaller().unmarshal(detailSource); 
    // throw new SoapFaultWithDetailException(detail); 

    } catch (IOException e1) { 
     throw new IllegalArgumentException("cannot unmarshal SOAP fault detail object: " + soapFaultDetail.getSource()); 
    } 

}