Jackson을 사용한 Spring REST - 400 잘못된 요청 로깅
Jackson/J를 사용하여 스프링 REST를 정상적으로 설정했습니다.SON과 모든 것이 작동합니다.
하지만 의도적으로 메시지 구조에 오류가 발생하여 400 - Bad Request가 발생했습니다.그러나 서버에 로그 출력이 없습니다.제가 예상하는 오류는 "Jackson unknown property exception" 또는 기타 오류일 것입니다. 하지만 발견되었고 400개의 오류가 클라이언트에 전송되었지만 서버에는 예외 로그가 없습니다.
서버의 모든 것을 명확하게 디버그하고 싶지는 않지만 오류로 명확하게 레이블이 지정된 Spring 네트워크 수준 예외를 원합니다.
이 스위치를 켜는 올바른 방법은 무엇입니까?
감사합니다!
@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
public void handle(HttpMessageNotReadableException e) {
logger.warn("Returning HTTP 400 Bad Request", 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.springframework.http.converter.xml.MarshallingHttpMessageConverter@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'
@Jukka의 답변을 바탕으로 다음을 사용하여 모든 컨트롤러에 대해 전역적으로 활성화할 수 있습니다.@ControllerAdvice
(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;
}
}
설정할 수 있습니다.log
이 속성에 대해 디버깅할 수준application.properties
.
logging.level.org.springframework.web= DEBUG
저의 경우, 문제는 제게 있었습니다.@ControllerAdvice
- 주석이 달린 클래스, 확장된ResponseEntityExceptionHandler
사용자 지정 예외 처리에 대한 임의 튜토리얼에서 핸들러 코드를 얻었기 때문에 슈퍼클래스가 무엇을 하고 있는지 확인할 필요가 없었습니다(제 사용자 지정 예외 처리는 잘 작동했습니다).
문제는ResponseEntityExceptionHandler.handleException()
손잡이MethodArgumentNotValidException
다른 Spring MVC 예외와 함께 처리 로직을 특정 핸들 메소드에 위임합니다.그러한 방법에 대한 구현을 제공하지 않았기 때문에(이 경우).handleMethodArgumentNotValid()
) 자신의 응답 본문을 반환하기 위해 null 본문으로 응답을 반환하는 기본 구현을 사용하게 되었습니다.
해결책
필요한 메서드를 재정의하거나 해당 클래스를 전혀 확장하지 않습니다.
응답 엔터티 확인구현된 처리기 메서드 목록에 대한 예외 처리기 문서입니다.
Response Entity를 확장하는 것이 의무적이라고 생각하지 않습니다.예외 처리기.ExceptionHandler로 주석이 달린 ControllerAdvices 클래스에 여러 처리기 메서드를 만들 수 있으며 모든 종류의 응답을 반환할 수 있습니다.자세한 내용과 코드 예제는 아래 링크를 참조하십시오.https://www.thetechnojournals.com/2019/11/how-to-handle-exceptions-in-rest.html
언급URL : https://stackoverflow.com/questions/17326976/spring-rest-using-jackson-400-bad-request-logging
'programing' 카테고리의 다른 글
AppCompat-v7이 있는 도구 모음 및 상황별 수행 표시줄 (0) | 2023.08.14 |
---|---|
XML 구문 분석 오류: FireFox에서는 제대로 포맷되지 않았지만 Chrome에서는 양호함 (0) | 2023.08.14 |
예쁜 에스슬린트, 에스슬린트 플러그인 프리티어와 에스슬린트 구성 프리티어의 차이점은 무엇입니까? (0) | 2023.08.14 |
Laravel 6에서 GeoJson을 mariadb 10.3으로 가져옵니다. (0) | 2023.08.14 |
유형 스크립트 오류 유형이 중복되지 않으므로 이 조건은 항상 'true'를 반환합니다. (0) | 2023.08.14 |