@ControllerAdvice
@ControllerAdvice注解是Spring3.2中新增的注解,只能用于类上,与下面三个方法注解结合可进行一些全局操作。
方法注解
@InitBinder
用于request中自定义参数解析方式进行注册,从而达到自定义指定格式参数的目的。
1 2 3 4 5 6 7 8 9 10 11 12 13
| @ControllerAdvice @ResponseBody @Slf4j public class GlobalExceptionHandler {
@InitBinder public void globalInitBinder(WebDataBinder binder) { binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd")); } }
|
@ModelAttribute
表示其注解的方法将会在目标Controller方法执行之前执行。
1 2 3 4 5 6 7 8 9 10
| @ControllerAdvice @ResponseBody @Slf4j public class GlobalExceptionHandler { @ModelAttribute(value = "key") public String globalModelAttribute() { System.out.println("添加了全局属性。"); return "key_value"; } }
|
1 2 3 4 5
| @GetMapping("/list") public List<String> list(@ModelAttribute("key") String key) { log.info("key: {}", key); return null; }
|
控制台打印:
添加了全局属性。
key: key_value
@ExceptionHandler
用于捕获Controller中抛出的指定类型的异常
返回自定义实体 统一格式,特别是前后端分离自定义消息格式(记得加@ResponseBody)。
返回 ModelAndView 跳转到指定页面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| package com.czm.handler;
import com.czm.constants.ResultCodeEnum; import com.czm.dto.ResultDto; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.MissingServletRequestParameterException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.NoHandlerFoundException;
@ControllerAdvice @ResponseBody @Slf4j public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class) public ResultDto<String> exceptionHandler(Exception exception) { log.error("未知错误:{},{}",exception.getClass().getName() ,exception.getMessage()); return ResultDto.buildErrorMeesage(ResultCodeEnum.ERROR.getCode(), ResultCodeEnum.ERROR.getMessage()); }
@ExceptionHandler(MissingServletRequestParameterException.class) public ResultDto<String> ParameterExceptionHandler( MissingServletRequestParameterException exception) { log.error("错误请求:{},{}",exception.getClass().getName() ,exception.getMessage()); return ResultDto.buildErrorMeesage(ResultCodeEnum.BAG_REQUEST.getCode(), ResultCodeEnum.BAG_REQUEST.getMessage()); }
@ExceptionHandler(NoHandlerFoundException.class) public ResultDto<String> NotFountHandler(NoHandlerFoundException exception) { log.error("404错误:{},{}",exception.getClass().getName(), exception.getMessage()); return ResultDto.buildErrorMeesage(ResultCodeEnum.NOT_FOUND.getCode(), ResultCodeEnum.NOT_FOUND.getMessage()); }
}
|
注:要想拦截404,400等错误请求,需要在springboot配置文件上加上一下配置,否则拦截不到
1 2 3 4 5 6 7
| spring: mvc: throw-exception-if-no-handler-found: true resources: add-mappings: false
|
END