Обработка ошибок клиента веб-службы Java Spring - PullRequest
5 голосов
/ 25 сентября 2011

Я написал клиент веб-службы (использующий Java Spring и JAXB Marshaller), который работает с веб-службой UPS. Когда я отправляю действительный запрос, все работает хорошо. Когда я отправляю неверный запрос (вес> 150 фунтов), веб-служба ИБП отвечает сообщением SOAP Fault. Клиентское приложение просто отказывает с

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").

Очевидно, что моя программа не может расшифровать ошибку SOAP, возвращенную веб-службой. Я написал пользовательский FaultMessageResolver, но он не вызывается. Вот код:

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");   
        }
    }
}

Спасибо за ваше время!

Ответы [ 2 ]

5 голосов
/ 10 февраля 2012

У меня была такая же проблема (ошибка SOAP с HTTP 200OK), и я решил ее, установив для свойства CheckConnectionForFault значение false. См .

5 голосов
/ 25 сентября 2011

Возьмите трассировку Wireshark. Я думаю, что, возможно, веб-служба отправляет ошибку SOAP, используя ( ошибочно ) HTTP 200OK вместо ошибки 500 Internal Server, и ваш клиент пытается обработать его как допустимыйответ.
Если это так, то проблема заключается в веб-службе, которая не соответствует стандарту SOAP (мой акцент):
С SOAP RFC

В случае ошибки SOAP при обработке запроса HTTP-сервер SOAP ДОЛЖЕН выдать ответ HTTP 500 «Внутренняя ошибка сервера» и включить сообщение SOAP в ответ, содержащий элемент SOAP Fault (см.раздел 4.4), указывающий на ошибку обработки SOAP.

Если вы не являетесь владельцем веб-службы, они должны это исправить.
Если честно, я не уверен, что будет работать весной-WS.
Если бы мне действительно нужно было работать в Jax-W, я бы заменил вызов заглушки на Диспетчер , чтобы сам обрабатывать необработанный xml и избегать автоматизацииic marshal / demarhal.
Посмотрите в Spring-W, если вы можете сделать то же самое, но это ошибка веб-службы, а не вашего клиента

...