@ControllerAdvice
和@RestControllerAdvice
注解使用及实现原理
统一异常处理
@RestControllerAdvice
其实就是比@ControllerAdvice
多了一个@ResponseBody
- 多个
ControllerAdvice
之间可以排序 - 多个
ControllerAdvice
处理异常时,按照优先级选择第一个能处理当前异常的@ControllerAdvice
,不会根据异常类型做最优匹配。 - 但是同一个
@ControllerAdvice
中如果有多个方法能处理当前异常,会按照异常类型做最优匹配 - 官方文档指出在配置多个
@ControllerAdvice
,具体使用哪个是动态匹配的,因此过多的@ControllerAdvice
可能影响性能.
@InitBinder
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-initbinder
- 每次请求带有参数的方法,都会执行该方法,
- 一个参数执行一次,一个参数对应一个WebDataBinder, 实现为ExtendedServletRequestDataBinder
- binder无法拿到参数值
- 可以反射WebDataBinder,设置自己的
org.springframework.validation.DataBinder.typeConverter
,这样可以拿到具体的参数值 @InitBinder
用在Controller(@Controller
)上,只会对当前的Controller生效@InitBinder
用在@ControllerAdvice
所在类的方法上,会对所有的Controller生效
final StringTrimmerEditor stringTrimmerEditor = new StringTrimmerEditor(false);
@InitBinder
public void initBinder(WebDataBinder binder, HttpServletRequest request) {
System.out.println("http请求参数名:" + binder.getObjectName());
CustomDateEditor dateEditor = new CustomDateEditor((SimpleDateFormat) df.clone(), true);
binder.registerCustomEditor(Date.class, dateEditor);
binder.registerCustomEditor(String.class, stringTrimmerEditor);
}