Spring注解@ControllerAdvice
@ControllerAdvice的作用
SpringBoot主要使用@ControllerAdvice注解处理指定的Controller中的异常;从下图可以看到@Controller底层使用了@Component注解,所以使用@ControllerAdvice注解后可以被扫描到。
@ControllerAdvice的使用
/**
* 统一处理异常
*
* 1、@ControllerAdvice配合@ExceptionHandler处理全局异常
* 可以指定处理某个包下的所有Controller、也可以是指定处理被某个注解修饰的Controller,不写则默认是所有的Controller
* 2、配合ModelAttribute预设全局数据
*
* 3、@ControllerAdvice配合@InitBinder实现对请求参数的预处理
*
*/
@ControllerAdvice
public class GlobalExceptionHandler {
private final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
/**
* @ExceptionHandler(Exception.class):表示此方法处理Exception类型的异常,如果参数为空,将默认方法参数列表中列出的任何异常
* @param e
* @return
*/
@ExceptionHandler(Exception.class)
@ResponseBody
public Object handleException(Exception e) {
log.error("Default Exception: ", e);
return ApiResponse.error(IMallExceptionEnum.SYSTEM_ERROR);
}
/**
* @ExceptionHandler(MallException.class): 表示此方法处理MallException类型的异常
* @param e
* @return
*/
@ExceptionHandler(MallException.class)
public Object HandlerIMallException(MallException e) {
log.error("MallException: " + e);
return ApiResponse.error(e.getCode(), e.getMsg());
}
/**
* 对Controoler中RequestMapping注解标识的方法中的所有String和Date类型的参数进行处理
* @param dataBinder
*/
@InitBinder
public void processParam(WebDataBinder dataBinder) {
StringTrimmerEditor stringTrimmerEditor = new StringTrimmerEditor(true);
dataBinder.registerCustomEditor(String.class, stringTrimmerEditor);
dataBinder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), false));
}
}
测试类
@RestController
public class TestController {
@RequestMapping("/test1")
public void test1() throws Exception {
throw new Exception("程序出错了");
}
}
输出结果