2010-10-27 65 views
2

我遇到以下問題: 我正在使用SAAJ進行Web服務。我有一個以下soap故障的SOAPMessage:Web服務中的java/soapfault問題

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
    <S:Fault xmlns:ns3="http://www.w3.org/2003/05/soap-envelope"> 
     <faultcode>S:Server</faultcode> 
     <faultstring>java.lang.NullPointerException</faultstring> 
     <detail> 
     <ns2:exception xmlns:ns2="http://jax-ws.dev.java.net/" class="java.lang.NullPointerException" note="To disable this feature, set com.sun.xml.internal.ws.fault.SOAPFaultBuilder.disableCaptureStackTrace system property to false"> 
      <ns2:stackTrace> 
       <ns2:frame class="myClass" file="HandlerFile.java" line="261" method="invoke" /><ns2:frame class="myClass" file="HandlerFile.java" line="1" method="invoke" /><ns2:frame class="com.sun.xml.internal.ws.api.server.InstanceResolver$1" line="unknown" method="invokeProvider" /></ns2:stackTrace> 
     </ns2:exception>  
     </detail> 
     </S:Fault> 
     </S:Body> 
</S:Envelope> 

但是,如果我試圖獲取細節,我什麼也得不到!
我做如下:

String code = soapMsg.getSOAPBody().getFault().getFaultCode(); 
String faultString = soapMsg.getSOAPBody().getFault().getFaultString(); 
Detail detail = reply.getSOAPBody().getFault().getDetail(); 
if(detail == null) 
    System.out.println("No detail"); 
else 
    System.out.println("Detail value is "+detail.getNodeValue()); 
Iterator it = reply.getSOAPBody().getFault().getDetail().getDetailEntries(); 
StringBuilder details = new StringBuilder(); 
details.append("Detail:"); 
while(it.hasNext()) 
{ 
    System.out.println("Has details"); 
    DetailEntry temp = (DetailEntry) it.next(); 
    System.out.println(temp.getTextContent()); 
    System.out.println(temp.getValue()); 
    details.append(temp.getValue()); 
    details.append("-"); 
    Iterator it2 = temp.getChildElements(); 
    while(it2.hasNext()) 
    { 
    Node t = (Node) it2.next(); 
    System.out.println("Node value:"+t.getNodeValue()); 
    } 
} 
System.out.println("Details:"+details.toString()); 

據印:
詳細值爲
有更多的細節
詳情:空值
節點值:
燦有人對此有所幫助?爲什麼我不能獲得SOAP錯誤的詳細信息?它包含在SOAP消息中?

更新:代碼和錯誤字符串打印正確。
I.e.
代碼:S:服務器
FaultString:顯示java.lang.NullPointerException

感謝

+1

您的示例不顯示如果detail元素實際上在ns2:frame元素中具有任何文本內容。您是否嘗試過使用'getChildElements'或任何dom方法訪問DetailEntry的子節點? – 2010-10-27 11:59:42

+0

@Jorn:我明白你的意思了。故障細節似乎報告服務器中的堆棧跟蹤(已更新後)。試圖使用getChildElements,我進入while循環但打印空值。在帖子中更新了代碼 – Cratylus 2010-10-27 12:33:19

回答

1

的方法getNodeValue總是返回null DOM元素,getTextContent會更好,但在你的情況下,所有信息包含在嵌套元素的屬性中。你將不得不用如下代碼遍歷這些嵌套元素。請注意,我還沒有測試過代碼。

String uri = "http://jax-ws.dev.java.net/"; 
QName qnException = new QName(uri, "exception"); 
QName qnStackTrace = new QName(uri, "stackTrace"); 
QName qnFrame = new QName(uri, "frame"); 

SOAPFault fault = soapMsg.getSOAPBody().getFault(); 
System.out.println("code=" + fault.getFaultCode()); 
System.out.println("faultString=" + fault.getFaultString()); 

for (Iterator i=fault.getDetail().getDetailEntries(); i.hasNext();) { 
    DetailEntry detailEntry = (DetailEntry)i.next(); 

    for (Iterator j=detailEntry.getChildElements(qnException); j.hasNext();) { 
     SOAPElement exception = (SOAPElement)j.next(); 
     System.out.println("exception class=" + exception.getAttribute("class")); 

     for (Iterator k=exception.getChildElements(qnStackTrace); k.hasNext();) { 
      SOAPElement stackTrace = (SOAPElement)k.next(); 

      for (Iterator l=stackTrace.getChildElements(qnFrame); l.hasNext();) { 
       SOAPElement frame = (SOAPElement)l.next(); 
       System.out.println(" class=" + frame.getAttribute("class")); 
       System.out.println(" file =" + frame.getAttribute("file")); 
      } 
     } 
    } 
} 
+0

謝謝。一旦我測試了它,我會告訴你它是否工作 – Cratylus 2010-10-27 19:45:44