Spring Boot: возвращен код ответа HTTP 400, вложенное исключение - java.io.IOException

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

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

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

соединение: close, content-length: 485, content-type: application / json, date: Thu, 08 Apr 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 & 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);
    
       }
    
    }
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
41
3

Ответы 3

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

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

ima.technophyle 09.04.2021 13:11

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

silentDev 09.04.2021 13:13

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

ima.technophyle 09.04.2021 13:17

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

silentDev 09.04.2021 13:50

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

В 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);

я хочу сделать это -> if (response.getStatusCodeValue () == 400) {... тогда сделай это ...} .. как я это сделаю?

ima.technophyle 09.04.2021 13:42

Вы можете использовать собственный ResponseErrorHandler.

Akif Hadziabdic 09.04.2021 13:49

Другие вопросы по теме