Trong thử nghiệm của tôi, sử dụng SimpleMappingExceptionResolver
không thể đăng nhập MissingServletRequestParameterException
, tôi kết hợp @ControllerAdvice
và Filter
để làm đăng nhập.
Sử dụng ControllerAdvice
để bắt Được tăng lên trong Bộ điều khiển MVC Spring.
@ControllerAdvice
public class GlobalDefaultExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger("global_controller_exception_logger");
@ExceptionHandler(value = Throwable.class)
public void defaultErrorHandler(Throwable e) throws Throwable {
// If the exception is annotated with @ResponseStatus rethrow it and let
// the framework handle it.
// AnnotationUtils is a Spring Framework utility class.
if (AnnotationUtils.findAnnotation
(e.getClass(), ResponseStatus.class) != null) {
throw e;
}
// Otherwise log exception
logger.error("global controller default exception handler", e);
throw e;
}
@ExceptionHandler(MissingServletRequestParameterException.class)
public void httpBadRequest(Exception e, HttpServletRequest request) throws Exception {
StringBuffer requestURL = request.getRequestURL();
logger.warn("{} HTTP Status 400 - {}", requestURL, e.getMessage());
throw e;
}
}
Sử dụng Filter
để bắt ngoại lệ bổ sung.
@WebFilter(
filterName = "ExceptionLogFilter",
urlPatterns = "/*",
dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.ASYNC, DispatcherType.ERROR}
)
public class ExceptionLogFilter implements Filter {
private static final Logger logger = LoggerFactory.getLogger("global_filter_exception_logger");
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
try {
chain.doFilter(request, response);
} catch (IOException | ServletException e) {
logger.error("bad thing happened during doFilter", e);
throw e;
}
}
......
}
cấu hình logback
<logger name="global_controller_exception_logger" level="info"/>
<logger name="global_filter_exception_logger" level="info"/>
Bạn có thể xem my gist cho mã đầy đủ.
Vì vậy, những ngoại lệ nào sẽ bị bỏ qua khi sử dụng phương pháp này và có cách nào để nhận những thứ đó không? –
Điểm tốt. Tôi đã không sử dụng mùa xuân bây giờ trong một thời gian dài và không thể nhớ. Tôi nên có thêm một chút thông tin ở trên. Đoán tốt nhất của tôi vào thời điểm này là ngoại lệ bắt nguồn từ 'RuntimeException', như tôi đã nói ở trên. –