Java-Spring-Web-Service-Client-Fehler-Handling
Ich geschrieben habe, eine web-service-client (mit Java, Spring und JAXB Marshaller), das mit der UPS-web-service. Wenn ich senden Sie eine gültige Anforderung funktioniert auch alles. Wenn ich senden Sie eine ungültige Anfrage (Gewicht > 150 lbs), dann die UPS web service antwortet mit einem SOAP-Fehler. Die client-Anwendung nur schlägt mit einem
org.springframework.oxm.UnmarshallingFailureException: JAXB unmarshalling
exception; nested exception is javax.xml.bind.UnmarshalException:
unexpected element (uri:"http://schemas.xmlsoap.org/soap/envelope/", local:"Fault").
Offensichtlich ist mein Programm ist nicht in der Lage, das zu entziffern, SOAP-fault der durch den Webdienst zurückgegeben. Ich schrieb eine benutzerdefinierte FaultMessageResolver, aber es wird nicht aufgerufen. Hier ist der code:
public class UpsRateClient extends WebServiceGatewaySupport {
public UpsRateClient(WebServiceMessageFactory messageFactory) {
super(messageFactory);
getWebServiceTemplate().setFaultMessageResolver(new UpsFaultMessageResolver());
}
public RateResponse getRate(RateRequest rateRequest) {
return (RateResponse) getWebServiceTemplate().marshalSendAndReceive(rateRequest, new UpsRequestWSMC());
}
private class UpsFaultMessageResolver implements FaultMessageResolver {
public void resolveFault(WebServiceMessage message) throws IOException{
System.out.println("Inside UpsFaultMessageResolver");
}
}
}
Vielen Dank für Ihre Zeit!
- Nimm einen wireshark trace.Mein Gedanke ist, dass vielleicht der web service sendet die SOAP-fault mit (fälschlicherweise) eine 200OK HTTP anstelle eines 500 Internal Server error und der client versucht, behandeln Sie es als eine gültige Antwort
- Du hast Recht! Das ist, was passiert ist. Wie bekomme ich dieses Problem dann? Danke für die Antwort, user384706!
- user544192, können Sie bitte zeigen Sie mir einige Ihrer code oder kann s oem nützlicher link darüber, wie Sie den Aufruf/das konsumieren des UPS webservice und Weitergabe/Empfang von POJOs? Ich bin mit ein wenig Schwierigkeiten zu verstehen, die Art und Weise, die ich brauche zu senden POJOs mit einem web-service, dass muss ich anrufen. Schicken Sie jede POJO-Parameter an die web service? Wenn ja, dann wie machen Sie POJOs in Ihrer Anwendung, die nur die UPS-web-service zu verstehen? Dankbar für Ihre Hilfe. Danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nimm einen wireshark trace.Mein Gedanke ist, dass vielleicht der web service sendet die SOAP-fault mit (fälschlicherweise) eine 200OK HTTP anstelle eines 500 Internal Server error und der client versucht, behandeln Sie es als eine gültige Antwort.
Wenn dies der Fall ist, dann liegt das problem in der web service, die nicht addere SOAP-standard(meine Betonung):
Von SOAP RFC
Wenn Sie nicht selbst das web-service -, Sie sollten dieses Problem beheben.
Um ehrlich zu sein bin ich nicht sicher, was die work arround wäre in Spring-WS.
Wenn ich wirklich einen work arround in Jax-Ws würde ich ersetzen, die stub-Aufruf mit einem Dispatcher verarbeiten der xml-Rohdaten selbst und vermeiden Sie die automatische Marschall/demarhal.
Blick in Spring-Ws, wenn Sie können das gleiche tun, aber dies ist ein Fehler der web-service, nicht Ihr Kunde
Ich hatte das gleiche problem (SOAP-Fehler mit HTTP 200OK) und ich löste es, die Einstellung der CheckConnectionForFault-Eigenschaft auf false. Sehen.