Может ли веб-служба получить пользовательское сообщение об ошибке от веб-службы на другом сервере? - PullRequest
0 голосов
/ 25 августа 2018

У меня есть веб-служба, работающая на сервере A, которая возвращает пользовательское сообщение об ошибке в объекте Java ResponseEntity, например:

return new ResponseEntity<String>("My custom error message.", HttpStatus.BAD_REQUEST);

У меня есть другая веб-служба, работающая на сервере B, которая вызывает веб-службу нана сервере А, но вместо «Моего пользовательского сообщения об ошибке» я получаю следующее:

не может проанализировать JSON.Необработанный результат: сервер вернул код ответа HTTP: 400

Если я вызываю веб-службу непосредственно на сервере А, то получаю ошибку 400 с «Моим настраиваемым сообщением об ошибке», как и ожидалось.

Я изолировал проблему, когда сервер B пытается прочитать ответ от сервера A.

BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));

Когда сервер B получает ошибку 400 от сервера A, conn.getInputStream () генерирует IOException, котороеперехватывается, но «Мое пользовательское сообщение об ошибке» теряется в исключении.

catch (IOException e) {
    return new ResponseEntity<String>(e.getMessage(), HttpStatus.BAD_REQUEST);
}

Возможно ли для сервера B вернуть пользовательское сообщение об ошибке с сервера A?Как это можно сделать?

Я использую Java 8, Spring Boot 2.0.2, Tomcat 9 и Swagger UI 2.8 для тестирования веб-сервисов.

ОБНОВЛЕНИЕ: Если сервер А возвращает код200 вместо 400, тогда IOException не генерируется на сервере B. Вместо этого генерируется JsonParseException, и сервер B возвращает «Мое пользовательское сообщение об ошибке».

1 Ответ

0 голосов
/ 25 августа 2018

Я думаю, причина этого в том, что ваше исключение корректно генерируется из A и обрабатывается внутри conn.getInputStream, который видит исключение BAD_REQUEST.Одно из возможных решений, которое я могу догадаться, заключается в том, что вы как-то проверяете перед тем, как заставить объект чтения входного потока проверять, вызывает ли подключение некое исключение.

try{
    conn.open();
    BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream()));
    }catch(Exception e){
     return new ResponseEntity<String>(e.getMessage(), HttpStatus.BAD_REQUEST);
}

Метод, подобный conn.open, должен выдавать ваше пользовательское исключение.перед созданием объекта считывателя входного потока

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...