@ControllerAdvice用来修饰类,表明该类是Controller的全局配置类,可以对所有Controller进行统一全局配置,包括:全局异常处理、全局绑定数据、全局绑定参数。
全局异常处理
- @ExceptionHandler: 用于修饰方法,该方法会在Controller出现异常后被调用,用于处理捕获到的异常。
@ControllerAdvice(annotations = Controller.class)
public class ExceptionAdvice {
private static final Logger logger = LoggerFactory.getLogger(ExceptionAdvice.class);
@ExceptionHandler({Exception.class})
public void handleException(Exception e, HttpServletRequest request, HttpServletResponse response) throws IOException {
//将异常记录进日志
logger.error("服务器发生异常: " + e.getMessage());
for (StackTraceElement element : e.getStackTrace()) {
logger.error(element.toString());
}
//根据请求的类型的不同处理响应
String xRequestedWith = request.getHeader("x-requested-with");
if ("XMLHttpRequest".equals(xRequestedWith)) {
//异步请求,页面写入json字符串
response.setContentType("application/plain;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write(CommunityUtil.getJSONString(1, "服务器异常!"));
} else {
//普通请求,重定向到错误html页面
response.sendRedirect(request.getContextPath() + "/error");
}
}
}
全局绑定数据
- @ModelAttribute: 用于修饰方法,该方法会在Controller方法执行前被调用,用于为Model对象绑定参数。
全局绑定参数
- @DataBinder: 用于修饰方法,该方法会在Controller方法执行前被调用,用于绑定参数的转换器。