Wie unmarshal eine SOAP-Fault-in einem FaultMessageResolver?
Ich bin neu in Spring-WS, und langsam meinen Kopf um ihn herum gewickelt. Jetzt Schreibe ich einen einfachen client zur Kommunikation mit einem vorhandenen WS. Ich bin mit dem WebServiceTemplate und die marshalSendAndReceive Methode. Alles funktioniert einwandfrei.
Jedoch, wenn ein SOAP-fault Auftritt, wird die WST wirft einen SoapFaultClientException. Ich bemerkte, dass ich meine eigenen FaultMessageResolver zu prüfen, was innerhalb der SOAP-fault. Jedoch, wenn ich versuche zu unmarshal die WebServiceMessage in meinem FaultMessageResolver, bekomme ich die folgende Fehlermeldung:
JAXB unmarshalling exception; nested exception is javax.xml.bind.UnmarshalException: unexpected element (uri:"http://schemas.xmlsoap.org/soap/envelope/", local:"Fault"). Expected elements are ....
Natürlich, mein unmarshaller ist nicht richtig konfiguriert. Habe ich zum generieren der JAXB-Fehler-Modell selbst mit xjc dann in der Lage sein, um unmarshal der Fehler??? Ich bin etwas erstaunt, dass dieser nicht bereits vorhanden ist.
Gibt es einen besseren Weg, um extra meine benutzerdefinierten Fehlerinformationen aus meiner soap:fault-Antwort? Meine Fehlermeldung sieht in etwa wie folgt, und ich versuche, zu extrahieren/Zugriff auf die serviceErrors Element.
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>Blaze Data Error</faultstring>
<detail>
<ns14:serviceErrors xmlns="http://www.nb.com/ClientServices/LendingSimulation/CalculateProfitabilityRequest" xmlns:ns13="http://www.nb.com/fw/errorMgmt" xmlns:ns14="http://www.nb.com/ClientServices/LendingSimulation/V1" >
<ns13:faultstring>ServiceExecutionError</ns13:faultstring>
<ns13:serviceError>
<ns13:errorCode>C10F1013</ns13:errorCode>
<ns13:errorType>B</ns13:errorType>
<ns13:errorMessage>Unable to retreive additional data</ns13:errorMessage>
<ns13:fieldName>Message error received from PHClient : [An unexpected error code was received : system=PH context=[empty]]</ns13:fieldName>
<ns13:systemId>Calculator</ns13:systemId>
<ns13:time>2012-06-19 14:45:10.151-0400</ns13:time>
</ns13:serviceError>
</ns14:serviceErrors>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>
Dank!
Eric
Du musst angemeldet sein, um einen Kommentar abzugeben.
Basiert auf dem Fehler, den du immer, es sieht aus wie Sie versuchen, zu unmarshall XML-Quelle, beginnend mit der
<soap:Fault>
Knoten. Ohne zu sehen, Ihre Java-code, bedeutet dies, dass Sie wahrscheinlich versuchen, unmarshall die Quelle, ausmessage.getSoapBody().getFault()
Sie müssen eigentlich tiefer gehen, um zu bekommen, um die
<ns14:serviceErrors>
Knoten.Sie sollten in der Lage sein, dies durch den folgenden Pfad... vielleicht nicht alle auf einmal 🙂
Ich bin mit
org.springframework.ws.client.core.WebServiceTemplate
. Ich Laufe in das gleiche Problem mitFault
unmarshalling. Ich habe dieses problem gelöst, indem die EinstellungWebServiceTemplate
EigenschaftcheckConnectionForFault
zufalse
. Also in meinem Fall war es wahrscheinlich verursacht durch den server nicht wieder status 500 Fehler.Dann
spring-ws
analysiert den Fehler und übergeben Sie es auf den StandardwertFaultMessageResolver
und ich bekam eine reguläreSoapFaultClientException
zu fangen.Aber das hat mir nur die Nachricht von der Schuld, so musste ich auch hinzufügen einer benutzerdefinierten
FaultMessageResolver
und extrahieren Sie die Nachricht entlang der gleichen Linien:Den marshaller ist die gleiche wie die für die
WebserviceTemplate
.