@ControllerAdvice
用于修饰类,表示该Controller是全局的配置类。
在此类中可以对Controller进行三种全局配置:异常处理方案、绑定数据方案、绑定参数方案。分别对应三种注解
@ExceptionHandler
用于修饰方法,该方法会在controller出现异常后被调用,用于处理捕获到的异常
@ModelAttribute
用于修饰方法,该方法会在controller方法执行前被调用,用于为Model对象绑定参数
绑定数据是指controller有很多请求,都用到同一个数据给模板,即需要往model里装同一个数据,可以利用该注解加上一个方法给model统一绑定参数
@DataBinder
用于修饰方法,该方法会在controller方法执行前被调用,用于绑定参数的转换器
页面向服务器传参时,会被自动的做转换,例如传page时自动转换成page对象,是因为Spring底层内置了很多参数转换器,自动进行判断调用,当出现全新的类型时,则可以自定义参数转换器,用该注解进行注册
public String getLetterList(Model model, Page page){
}
package com.nowcoder.community.controller;
@RequestMapping(path = "/error",method = RequestMethod.GET)
public String getErrorPage(){
return "/error/500";
}
package com.nowcoder.community.controller.advice;
@ControllerAdvice(annotations = Controller.class)
public class ExceptionAdvice {
private static final Logger logger= LoggerFactory.getLogger(ExceptionAdvice.class);
@ExceptionHandler(Exception.class)
public void handlerException(Exception e, HttpServletRequest request, HttpServletResponse response) throws IOException {
//参数可设置多个,看文档,以上三个参数基本可以包括大多数问题
//将异常记录到日志里
logger.error("服务器发生异常"+e.getMessage());//对异常的概况
//详细信息
for (StackTraceElement element: e.getStackTrace()){
logger.error(element.toString());
}
//对于普通请求和异步请求分开处理
//普通请求返回的是页面,可以重定向到错误页面,但异步请求返回的是JSON数据
String xRequestedWith= request.getHeader("x-requested-with");
if("XMLHttpRequest".equals(xRequestedWith)){ //说明是异步请求
response.setContentType("application/plain;charset=utf-8");
PrintWriter writer=response.getWriter();
writer.write(CommunityUtil.getJOSNString(1,"服务器异常"));
}else { //普通请求
response.sendRedirect(request.getContextPath()+"/error");
}
}
}
测试:分别在普通请求和异步请求中人为添加错误,访问触发该请求的对应页面,报错且控制台有日志
该文章内容来自牛客网java项目课程