@ControllerAdvice 注解
这是一个增强的 Controller,对controller层做异常处理、数据预处理、全局数据绑定, springboot 会自动扫描到,不需要调用。
这个注解是spring MVC提供的,在springboot中也可以使用
全局异常处理
使用 @ControllerAdvice 注解,相当于开启了全局异常捕获,具体实现只需两步:
第一步:定义类,添加 @ControllerAdvice 注解,开启全局异常捕获;
第二步:在方法上,使用 @ExceptionHandler,定义捕获异常的类型即可。
@ControllerAdvice
public class ControllerExceptionHandler {
/**
* 校验的统一异常处理
* @param e
* @return ComResponse
*
* BindException 有针对性的,是校验不通过时,报的错误异常类做处理
* Exception 对所有的报错异常做处理
*/
@ExceptionHandler(value = {BindException.class})
@ResponseBody
public ComResponse validExceptionHandler(BindException e) {
// 获取我们定义的校验失败的异常信息
String msg = e.getBindingResult().getAllErrors().get(0).getDefaultMessage();
ComResponse comResponse = new ComResponse<>();
comResponse.setMsg(msg);
comResponse.setSuccess(false);
return comResponse;
}
}
在该类中,你可以定义多个方法,不同方法吹不同的异常,只需要指定:@ExceptionHandler(value = {xxxException.class}),例如专门做空指针的处理方法,专门做数组越界的处理方法。
@ExceptionHandler 注解来指明异常的处理类型,上边例子中,指定BindException类型,那么除了参数校验抛出的异常,其他异常不会进这个方法中来。
关于@ControllerAdvice和@RestControllerAdvice区别:
在具体使用上,
1)注解有@ControllerAdvice的类, 需要在具体方法上同时添加@ExceptionHandler和@ResponseBody注解;
2)注解有@RestControllerAdvice的类,只需要在具体方法上添加@ExceptionHandler注解。
全局数据绑定
全局数据绑定功能可以用来做一些初始化数据的操作,我们可以将一些公共的数据定义在添加了 @ControllerAdvice 注解的类中,这样,在每一个 Controller 的接口中,就都能够访问导致这些数据。
使用 @ModelAttribute 注解标记该方法的返回数据是一个全局数据,默认情况下,这个全局数据的 key 就是返回的变量名,value 就是方法返回值,当然开发者可以通过 @ModelAttribute 注解的 name 属性去重新指定 key。
定义完成后,在任何一个Controller 的接口中,都可以获取到这里定义的数据:
定义:
@ControllerAdvice
public class Test {
@ModelAttribute(name = "globalData")
public Map<String, Object> setGlobalData() {
Map<String, Object> map = new HashMap<>(){
{
put("username", "吕星辰");
put("uid", 123);
}
};
return map;
}
}
获取全局数据
@RestController
public class UserController {
@RequestMapping(value = "/test")
public String userTest(Model model) {
// 获取全局数据
Map<String, Object> map = model.asMap();
String json = JSON.toJSONString(map, SerializerFeature.PrettyFormat);
System.out.println(json);
return json;
}
}
输出:
还没有评论,来说两句吧...