RestTemplate попробуйте поймать
Я читаю ResponseEntity из веб-службы, используя приведенный ниже код Java (Spring 2.0):
public ResponseEntity<?> getTemplate() {
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<?> myResponse= restTemplate.postForEntity(
myUrl,
myRequestObj,
MyResponseObj.class);
return myResponse;
}
Однако, если веб-сервис myUrl возвращает HttpStatus.BAD_REQUEST (400), это не назначается myResponse и выдается ошибка, поэтому ResponseBody нет, и мне нужно заключить запрос в блок try catch. Это правильно или есть способ обойти это? Кроме того, означает ли это, что веб-сервис myUrl никогда не должен намеренно (программно) устанавливать HttpStatus myResponseObj на HttpStatus.BAD_REQUEST? Таким образом, даже если myRequestObj содержит неверные данные, myUrl webService все равно должен установить статус ответа примерно на 200, то есть HttpStatus.NO_CONTENT. Любые комментарии о том, как это сделать правильно, приветствуются.
1 ответ
Это правильно или есть способ обойти это?
Описываемое вами поведение определяется обработчиком ошибок пружины detault, который выдает HttpClientErrorException
в случае кода состояния в диапазоне 400-499, HttpServerErrorException
в случае кода состояния в диапазоне 500-599 и UnknownHttpStatusCodeException
если код состояния неизвестен. Чтобы обрабатывать такие коды ошибок, вы можете либо перехватить исключения, либо зарегистрировать собственный обработчик исключений, как описано здесь.
Кроме того, означает ли это, что веб-сервис myUrl никогда не должен намеренно (программно) устанавливать HttpStatus myResponseObj на HttpStatus.BAD_REQUEST?
Согласно RFC 7231, код состояния 400 используется, чтобы указать, что сервер не может или не будет обрабатывать запрос из-за ошибки, совершенной клиентом при создании запроса (например, неверный синтаксис запроса, недопустимое формирование сообщения запроса или вводящий в заблуждение маршрутизация запросов). Следовательно, вы можете использовать этот код состояния, чтобы указать клиенту на такое поведение.