Подтвердить что ты не робот

Spring REST с использованием журнала Badson - 400

У меня есть spring REST, настроенный с использованием Jackson/JSON, и все работает.

Но я сознательно ввел в структуру сообщения сообщение об ошибке, в результате которой был введен 400-Bad Request. Но на сервере не было выхода журнала. Ошибка, которую я ожидал бы, была бы чем-то вроде "неизвестного исключения Джексона" или что-то еще, но она была поймана, и 400 ошибок было отправлено клиенту, но не было журнала исключения на сервере.

Я не хочу полностью отлаживать все на сервере, но я хочу, чтобы spring исключения на сетевом уровне, подобные этому, явно обозначались как ошибка.

Каков правильный способ включения этого параметра?

Спасибо!

4b9b3361

Ответ 1

@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
public void handle(HttpMessageNotReadableException e) {
    logger.warn("Returning HTTP 400 Bad Request", e);
}

Ответ 2

Основываясь на ответе @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;
    }
}

Ответ 3

В случае, если кто-то еще споткнется об этой проблеме, следующее работает для меня в 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'