Ответ 1
@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
public void handle(HttpMessageNotReadableException e) {
logger.warn("Returning HTTP 400 Bad Request", e);
}
У меня есть spring REST, настроенный с использованием Jackson/JSON, и все работает.
Но я сознательно ввел в структуру сообщения сообщение об ошибке, в результате которой был введен 400-Bad Request. Но на сервере не было выхода журнала. Ошибка, которую я ожидал бы, была бы чем-то вроде "неизвестного исключения Джексона" или что-то еще, но она была поймана, и 400 ошибок было отправлено клиенту, но не было журнала исключения на сервере.
Я не хочу полностью отлаживать все на сервере, но я хочу, чтобы spring исключения на сетевом уровне, подобные этому, явно обозначались как ошибка.
Каков правильный способ включения этого параметра?
Спасибо!
@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
public void handle(HttpMessageNotReadableException e) {
logger.warn("Returning HTTP 400 Bad Request", e);
}
Основываясь на ответе @Jukka, вы можете включить это глобально для всех контроллеров, используя @ControllerAdvice
(представленный в Spring 3.2). Это требует небольшого кода на вашем конце, но, по моему опыту, вы, как правило, нуждаетесь в глобальной конфигурации обработки ошибок, и это позволяет вам установить точки останова/легко проверить проблемы.
Пример этого ниже:
@ControllerAdvice
public class ControllerConfig {
@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
public void handle(HttpMessageNotReadableException e) {
log.warn("Returning HTTP 400 Bad Request", e);
throw e;
}
}
В случае, если кто-то еще споткнется об этой проблеме, следующее работает для меня в Spring Boot 2/Spring 5 и не требует изменения кода.
Я установил уровень журнала для org.springframework.web.servlet.mvc.method.annotation
в DEBUG
. В моем случае я видел 400 ответов в своем клиентском коде, но не входил в систему на стороне сервера (даже с пользовательским обработчиком ошибок). После изменения этого уровня журнала проблема стала очевидной:
DEBUG 172.19.0.16 cs 2018-Jun-08 20:55:08.415 [https-jsse-nio-443-exec-9] - method.annotation.RequestResponseBodyMethodProcessor[line ?] - Read [class java.lang.String] as "application/xml;charset=UTF-8" with [org.spr[email protected]2de50ee4]
DEBUG 172.19.0.16 cs 2018-Jun-08 20:55:08.418 [https-jsse-nio-443-exec-9] - method.annotation.ServletInvocableHandlerMethod[line ?] - Failed to resolve argument 0 of type 'java.lang.String'
org.springframework.beans.TypeMismatchException: Failed to convert value of type 'core.dto.RequestDTO' to required type 'java.lang.String'