# Axis2 Fault - Wie im Client auslesen?



## Sleepwalker (29. Dez 2010)

Hi,

ich weiß nicht, wie ich das Problem anders benennen sollte. Es geht um folgendes:

Ich spreche einen Web Service über Axis2 mit RAMPart an. Das Databinding ist auf xmlbeans gesetzt und der Aufruf ist synchron. RAMPart funktioniert soweit. Der Aufruf des Web Services ist wie folgt:

```
...
FooResponseDocument response = stub.putMessage(putMessageDocument);
catch (AxisFault ex) {
    System.err.println("AxisFault!");
    System.err.println("Message: " + ex.getMessage());
    System.err.println("Fault Code: " + ex.getFaultCode());
    System.err.println("Details: " + ex.getDetail());     
    System.err.println(ex.getFaultNode());
    System.err.println(ex.getReason());
    if (ex.getFaultMessageContext() != null) {         
        System.err.println("Envelope: " + ex.getFaultMessageContext().getEnvelope().toString());
    }
}
```

Ich bekomme nun aber einen AxisFault zurück.
Mein Problem ist, dass ich nicht an die Nachricht selbst herankomme. Ich möchte den Quellcode des Stubs nicht verändern, sondern das Objekt in der Hand haben und ausgeben können.

Ich bekomme mit dem obigen Code aber nur das hier als Ausgabe:

```
Message: A Soap envelope with fault action -http://www.w3.org/2005/08/addressing/soap/fault has been received without a fault element in the soap body
Fault Code: null
org.apache.axis2.AxisFault: A Soap envelope with fault action -http://www.w3.org/2005/08/addressing/soap/fault has been received without a fault element in the soap body
Details: null
null
A Soap envelope with fault action -http://www.w3.org/2005/08/addressing/soap/fault has been received without a fault element in the soap body
```

In der Antwort-Nachricht selbst steht aber angeblich noch mehr drin (sagt der Entwickler beim Testen mit meiner Nachricht):
[XML]Verschlüsselungskram
...
</soap:Header>
  <soapenv:Body wsu:Id="foo" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
    <soapenv:Fault xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
      <faultcode>soapenv:Client</faultcode>
      <faultstring>Invaild Foo</faultstring>
      <detail>
        <ErrorMessage>Yout foo is not valid</ErrorMessage>
      </detail>
    </soapenv:Fault>
  </soapenv:Body>
</soap:Envelope>[/XML]

Wie komme ich da ran? Auf den Web Service habe ich keinerlei Einfluss. Habe ich irgendwo etwas vergessen?
Vielen Dank im Voraus.

Gruß


----------



## Keo (30. Dez 2010)

In deiner Methode "putMessage" müsste in der WSDL ein spezifisches Fault definiert worden sein. Statt den Fehler mit AxisFault abzufangen, würde ich diesen definierten Fault abfangen. Wenn Du dir nicht sicher bist, ob diese Fehlerinformation des Entwicklers erhälst, könntest Du mittels SOAPUI den Nachrichteninhalt prüfen. Die Fehlermeldung "...has been received without a fault element in the soap body" sagt eigentlich schon aus, dass Du kein Fault bekommst.


----------



## Sleepwalker (3. Jan 2011)

Hi,

wünsche ein frohes, neues Jahr.
Ich habe keine Faults in der WSDL definiert, weil mir die so zur Verfügung gestellt wurde. Habe keinerlei Zugriff auf den Web Service. Ich nehme mal an, dass ich nicht einfach die Faults der Testcases für meinen Client da reinschreiben kann (wüsste leider auch gar nicht, wie).
Sogar wenn ich einen HTTP 500 Fehler zurück bekomme (weiterer Testcase, in TCPMon gut zu sehen), habe ich die gleiche Fehlermeldung wie im obigen Post.

SOAPUI hilft mir nicht viel, weil ich RAMPart zur Verschlüsselung nutze. Alles, was ich in TCPMon sehe, ist die verschlüsselte Antwort. Ich nehme an, mit SOAPUI wäre es das gleiche.

Wenn ich in den Stub reinschreibe, dass er die Nachricht ausgeben soll, dann kommt er im Fehlerfall gar nicht erst soweit und wirft schon vorher den AxisFault.

Gruß


----------



## Keo (3. Jan 2011)

Wenn der WebService über eine SSL-Verbindung abgesichert ist, kannst du auch mit SOAPUI den Keystore angeben und somit auch den Nachrichteninhalt ansehen.

In wsdl müsste in der Response-Methode eine Struktur "Fault" mit den Elemten faultcode, faultstring und detail definiert worden sein. In deiner generierten Skeleton-Klasse könntest du auch prüfen, welche Exception-Klasse in der webservice-Methode geworfen wird. Wird dort ein AxisFault geworfen, wurde in der wsdl kein anwendungspezifisches Fault definiert und der folgende Nachrichteninhalt könnte mit deinen generierten Sourcen nicht gelesen werden.

[XML]<soapenv:Fault xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
      <faultcode>soapenv:Client</faultcode>
      <faultstring>Invaild Foo</faultstring>
      <detail>
        <ErrorMessage>Yout foo is not valid</ErrorMessage>
      </detail>
[/XML]


----------



## Sleepwalker (6. Jan 2011)

In der WSDL ist leider kein Fault zu finden.

Wie kann ich denn mit SOAPUI die Nachrichten abfangen und entschlüsseln? Ich habe das Tool noch nie benutzt und komme damit gar nicht zu Rande. Ist das wie TCPMon ein "Proxy" oder horcht es wie Wireshark? Was muss ich denn dafür alles machen?! Den KeyStore in den Einstellungen einfügen geht, aber dann hörts auch schon auf.


----------



## Keo (6. Jan 2011)

SoapUI kann sowohl ein Client als auch ein Webservice simulieren. Da TCPMon mit integriert ist, kannst du mit dem Tool auch Nachrichten mitschneiden. Du gibst in den Einstellungen den Keystore und Passwort an, erstellst ein neues Projekt und importierst die wsdl-Datei hinzu. Danach kannst du die Parameter der Request-Methoden angeben und ggf. im Header die Basic Authentification-Informationen. Dann die Endpoint-Adresse übergeben und auf Ausführen drücken.
Bevor ich Client-Funktionalität implementiere, nutze ich immer zuerst dieses Tool um zu analysieren wie sich der Webservice "verhält"


----------



## Sleepwalker (25. Jan 2011)

Hi,

ich hatte immer noch keine Zeit für SoapUI, aber ich habe eine mögliche Ursache meines Problems:

1. Die Nachrichten sind verschlüsselt
2. Die Fehlermeldung kommt auch verschlüsselt bei mir an
3. Der SOAP Header enthält die "action" eines Faults (im Klartext)
4. Axis2 oder RAMPart versuchen anscheinend den Body der Nachricht auch im Klartext zu lesen, weil im Header ja steht, dass es ein Fault sei. Der Body existiert natürlich so nicht, wenn noch nichts entschlüsselt ist


Problem: Wie bekomme ich eine "erzwungene" Entschlüsselung eines Faults hin?


----------

