Весенняя загрузка: возвращен код ответа HTTP 400, вложенным исключением является исключение java.io.IOException

#java #spring-boot

Вопрос:

Рассмотрим приведенный ниже код.Здесь, когда код состояния, возвращаемый ответом, равен 200, выполнение кода работает идеально.

Но если я попытаюсь вернуть код состояния 400, то в указанной строке будет обнаружено исключение.

*Ответ на ошибку: Внутренняя ошибка сервера в : Ошибка ввода-вывода GetResponse при запросе POST для «http://localhost:8090/get-data»: Сервер вернул код ответа HTTP: 400 для URL: http://localhost:8090/get-data; вложенным исключением является исключение java.io.IOException: Сервер вернул код ответа HTTP: 400 для URL: http://localhost:8090/get-data

соединение: закрыто, длина содержимого: 485, тип содержимого: приложение/json, дата: Чт, 08 апреля 2021 20:25:47 GMT*

Почему возникает исключение при возврате статуса 400?

  @RestController
    Class ABC{
    
        @Autowired
        RestTemplate template;
    
        @PostMapping("....")
        ResponseEntity<Object> getResponse(){
            ResponseEntity<String> response
            try{
              HttpEntity<Object> body=new HttpEntity(obj,header); // data obj amp; httpheader
              response=template.postForEntity("http://localhost:8090/get- 
                       data",body,String.class);
            }catch(HttpStatusCodeException ex){
                  throw....
            }catch(Exception ex){
                throw Internal Server Error.....  //Exception is thrown here
            }       
            if(response.getStatusCodeValue()==200){
                 ...
            }
               ...
    
        }
    }
    
    @RestController
    Class XYZ{
       
       @PostMapping("/get-data")
       ResponseEntity<Object> getTheStatus(@RequestHeader HttpHeaders headers ,@ResponseBody MyData data){
    
              return new ResponseEntity<>("",HttpStatus.BAD_REQUEST);
    
       }
    
    }
 

Ответ №1:

В контексте HTTP статус ответа 200 означает успешный ответ. Статусы 4xx и 5xx представляют некоторые проблемы. Проблема может быть связана с запросом, подключением, сервером или другим источником. Некоторые реализации HTTP-клиента, такие как RestTemplate, будут создавать исключения в случае кода состояния «неуспешный», поскольку состояние ответа «неуспешный» представляет собой неудачное выполнение.

Если вы хотите избежать исключений, вы можете добавить обработчик ошибок.

 public class RestTemplateResponseErrorHandler 
  implements ResponseErrorHandler {

    @Override
    public boolean hasError(ClientHttpResponse httpResponse) throws IOException {
      return false;
    }

    @Override
    public void handleError(ClientHttpResponse httpResponse) throws IOException {}
}

RestTemplate restTemplate = restTemplateBuilder
          .errorHandler(new RestTemplateResponseErrorHandler())
          .build();

template.postForEntity("http://localhost:8090/get-data", body, String.class);
 

Комментарии:

1. я хочу выполнить так-> если(response.getStatusCodeValue()==400) {… тогда сделай это…} ..как я это сделаю ?

2. Вы можете использовать пользовательский обработчик ошибок ответа.

Ответ №2:

это происходит из-за передачи HttpStatus.BAD_REQUEST

Комментарии:

1. ДА… даже если параметры неверны, то статус 200 не должен правильно выполнять функцию, верно? Проблема в том, когда я возвращаю BAD_REQUEST

2. когда вы передали HttpStatus. BAD_REQUEST возвращает ответ с 400. для правильного ответа передайте HttpStatus.OK

3. что делать, если микросервис выдаст ошибку запроса, и как я получу этот ответ, если верну 200..?

4. используйте try catch или if else и передайте указанный код ошибки, если вы зафиксировали ошибку.

Ответ №3:

ИМХО, возвращающий статусы 4xx, подобные этому, не лучший способ, используйте @ControllerAdvice вместо этого