2017-11-27 7 views
1

Ich bin in der Lage, Anfrage und Antwort für eine gültige Soap-Anfrage (Klasse generiert durch wsimport) erfolgreich zu protokollieren, aber konnte den XML-Inhalt nicht erfassen, wenn eine Ausnahme ausgelöst wird (wenn ein Knoten in der Anfrage mit ungültigen Daten gefüllt ist). Ich könnte die Details der Antwort erhalten, aber ich möchte nur den XML-Teil der rohen Antwort erfassen. Ich habe versucht, SOAPFaultException, aber das gibt nur die Ausnahme Nachricht anstatt der vollen Umschlag mit Körper der Antwort.Wie erhalte ich die Ausnahme mit nur der XML-Inhalt in der Ausnahme/Fehler geworfen.Wie Soap-Fehlerantwort für eine ungültige Daten in Anfrage erfassen?

Hinweis: Ich weiß, ich kann den Fehler analysieren (rohe Antwort) und den XML-Inhalt ziehen, aber ich frage mich, ob es einen einfachen Weg/Methode gibt, um den XML-Inhalt wie unten zu erhalten. Der Inhalt wie (Antwort von Soap UI-Tool erfasst) aussehen sollte

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"> 
    <env:Header xmlns:env="http://www.w3.org/2003/05/soap-envelope"> 
     <wsa:Action>http://schemas.xmlsoap.org/ws/2004/08/addressing/fault</wsa:Action> 
     <wsa:MessageID>urn:uuid:xyz</wsa:MessageID> 
     <wsa:RelatesTo>urn:uuid:xyz</wsa:RelatesTo> 
     <wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To> 
    </env:Header> 
    <soap:Body> 
     <soap:Fault> 
     <soap:Code> 
      <soap:Value>soap:Sender</soap:Value> 
     </soap:Code> 
     <soap:Reason> 
      <soap:Text xml:lang="en">The 'http://www.fakexyz.com/schemas/xyz:xyz' element is invalid - The value '123' is invalid according to its datatype 'String' - The Pattern constraint failed. 
Please revise your data fields and make sure that message is correctly formatted.</soap:Text> 
     </soap:Reason> 
     <detail> 
      <faulttype>Schema</faulttype> 
     </detail> 
     </soap:Fault> 
    </soap:Body> 
</soap:Envelope> 

Antwort

0

Nach mehr zu erforschen und zu versuchen, fand ich, dass wir eine Klasse haben, müssen die SoapHandler Schnittstelle implementieren sollten, das gibt Ihnen ziemlich viel, was nötig war. Ich überschrieb HandleFault-Methode wie folgt.

public boolean handleFault(SOAPMessageContext context) { 
     System.out.println("==============================================RESPONSE(ERROR)=======================================\r\n"); 

     String[] abc= context.get(MessageContext.HTTP_RESPONSE_HEADERS).toString().split("],"); 

     for(String httpheader:abc) { 
      System.out.println(httpheader+"],"); 
     } 

     System.out.println("\r\n"); 

     SOAPMessage message= context.getMessage();     
     try {           
      Source source = message.getSOAPPart().getContent();    
      Transformer transformer = TransformerFactory.newInstance().newTransformer();    
      transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
      transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3");             
      transformer.transform(source, new StreamResult(System.out)); 

     } catch (Exception e) {    
       System.out.println("Response has errors!!"); 
      } 
     return false; 
    } 

Das gab mir Fehlerinformationen in formatiertem XML sowie mit http-Headern.

Verwandte Themen