Spring boot의 json 형식에 맞지 않을때, 그 데이터를 로그로 뿌려 주기
2025. 4. 7. 23:33ㆍJava/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);
}
}