@ControllerAdvice 注解

た 入场券 2022-10-12 01:08 287阅读 0赞

这是一个增强的 Controller,对controller层做异常处理、数据预处理、全局数据绑定, springboot 会自动扫描到,不需要调用。

这个注解是spring MVC提供的,在springboot中也可以使用

全局异常处理

使用 @ControllerAdvice 注解,相当于开启了全局异常捕获,具体实现只需两步:

第一步:定义类,添加 @ControllerAdvice 注解,开启全局异常捕获;
第二步:在方法上,使用 @ExceptionHandler,定义捕获异常的类型即可。

  1. @ControllerAdvice
  2. public class ControllerExceptionHandler {
  3. /**
  4. * 校验的统一异常处理
  5. * @param e
  6. * @return ComResponse
  7. *
  8. * BindException 有针对性的,是校验不通过时,报的错误异常类做处理
  9. * Exception 对所有的报错异常做处理
  10. */
  11. @ExceptionHandler(value = {BindException.class})
  12. @ResponseBody
  13. public ComResponse validExceptionHandler(BindException e) {
  14. // 获取我们定义的校验失败的异常信息
  15. String msg = e.getBindingResult().getAllErrors().get(0).getDefaultMessage();
  16. ComResponse comResponse = new ComResponse<>();
  17. comResponse.setMsg(msg);
  18. comResponse.setSuccess(false);
  19. return comResponse;
  20. }
  21. }

在该类中,你可以定义多个方法,不同方法吹不同的异常,只需要指定:@ExceptionHandler(value = {xxxException.class}),例如专门做空指针的处理方法,专门做数组越界的处理方法。
@ExceptionHandler 注解来指明异常的处理类型,上边例子中,指定BindException类型,那么除了参数校验抛出的异常,其他异常不会进这个方法中来。

关于@ControllerAdvice和@RestControllerAdvice区别:

在具体使用上,

1)注解有@ControllerAdvice的类, 需要在具体方法上同时添加@ExceptionHandler和@ResponseBody注解;

2)注解有@RestControllerAdvice的类,只需要在具体方法上添加@ExceptionHandler注解。

全局数据绑定

全局数据绑定功能可以用来做一些初始化数据的操作,我们可以将一些公共的数据定义在添加了 @ControllerAdvice 注解的类中,这样,在每一个 Controller 的接口中,就都能够访问导致这些数据。

使用 @ModelAttribute 注解标记该方法的返回数据是一个全局数据,默认情况下,这个全局数据的 key 就是返回的变量名,value 就是方法返回值,当然开发者可以通过 @ModelAttribute 注解的 name 属性去重新指定 key。

定义完成后,在任何一个Controller 的接口中,都可以获取到这里定义的数据:

定义:

  1. @ControllerAdvice
  2. public class Test {
  3. @ModelAttribute(name = "globalData")
  4. public Map<String, Object> setGlobalData() {
  5. Map<String, Object> map = new HashMap<>(){
  6. {
  7. put("username", "吕星辰");
  8. put("uid", 123);
  9. }
  10. };
  11. return map;
  12. }
  13. }

获取全局数据

  1. @RestController
  2. public class UserController {
  3. @RequestMapping(value = "/test")
  4. public String userTest(Model model) {
  5. // 获取全局数据
  6. Map<String, Object> map = model.asMap();
  7. String json = JSON.toJSONString(map, SerializerFeature.PrettyFormat);
  8. System.out.println(json);
  9. return json;
  10. }
  11. }

输出:

20210702114547706.png

发表评论

表情:
评论列表 (有 0 条评论,287人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ControllerAdvice注解的使用

    为了方便对异常的统一管理,spring mvc提供了ControllerAdvice注解对异常进行统一的处理,拿到这些异常信息后,可以做一些处理,比如提供一个统一的web界面查