2010-10-27 8 views
2

J'ai le problème suivant: J'utilise SAAJ pour les services Web. J'ai un SOAPMessage avec la faute de savon suivant:Problème java/soapfault dans les services Web

<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> 

Mais si j'essaie d'obtenir les détails que je ne reçois rien!
je le fais comme suit:

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()); 

Il est imprimé:
valeur détaillée est null
a des détails
Détails: valeurs NULL
valeur Noeud: null
Can Quelqu'un a-t-il aidé? Pourquoi ne puis-je pas obtenir les détails de la faute SOAP? Il est inclus dans le message SOAP?

MISE À JOUR: Le code et la faultstring sont imprimés correctement.
I.e.
Code: S: Serveur
faultString: java.lang.NullPointerException

Merci

+1

Votre exemple ne montre pas si l'élément detail contient réellement un contenu textuel dans l'élément ns2: frame. Avez-vous essayé d'accéder aux childnodes de DetailEntry en utilisant 'getChildElements' ou l'une des méthodes dom? –

+0

@Jorn: Je vois ce que tu veux dire. Le détail de la faute semble signaler la trace de la pile dans le serveur (mettre à jour la publication). J'ai essayé d'utiliser getChildElements, je reçois dans la boucle while mais la valeur null est imprimée. Avoir mis à jour le code dans le message ainsi – Cratylus

Répondre

1

La méthode getNodeValue retournera toujours null pour un élément DOM, getTextContent serait mieux, mais dans votre cas toutes les informations sont contenu dans les attributs des éléments imbriqués. Vous devrez traverser ces éléments imbriqués avec du code comme celui-ci. Veuillez noter que je n'ai pas encore testé le code.

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

Merci. Dès que je l'ai testé, je vous ferai savoir si cela a fonctionné – Cratylus

Questions connexes