Spring boot의 json 형식에 맞지 않을때, 그 데이터를 로그로 뿌려 주기

2025. 4. 7. 23:33Java/Spring Boot

@ControllerAdvice 사용

request body는 1회만 읽을 수 있기 때문에, ContentCachingRequestWrapper를 이용하여 다음 Filter에 전달

GlobalExceptionHandler

@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(HttpMessageNotReadableException.class)
    public ResponseEntity<String> handleInvalidJson(HttpServletRequest request, Exception ex) {
        String body = extractBody(request);
        log.error("💥 Invalid JSON Received: {}", body);
        log.error("🧨 Exception: {}", ex.getMessage());

        // Print headers
        log.info("📦 Request Headers:");
        Enumeration<String> headerNames = request.getHeaderNames();
        while (headerNames != null && headerNames.hasMoreElements()) {
            String header = headerNames.nextElement();
            String value = request.getHeader(header);
            log.info("➡ {}: {}", header, value);
        }

        return ResponseEntity
                .badRequest()
                .body("Malformed request received");
    }

    private String extractBody(HttpServletRequest request) {
        ContentCachingRequestWrapper wrapper = (ContentCachingRequestWrapper) request;
        byte[] buf = wrapper.getContentAsByteArray();
        return new String(buf, StandardCharsets.UTF_8);
    }
}

CachingRequestFilter

@Component
public class CachingRequestFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper((HttpServletRequest) request);
        chain.doFilter(wrappedRequest, response);
    }
}