前言:从该注解的名字可以看到,这是一个与切面有关的注解,事实上也是如此,我们都知道切面的注解肯定都有个作用范围,切面类的注解只能对其作用范围内的操作,实现切面操作。那RestCntrollerAdvice的作用范围是什么呢?
一、RestControllerAdvice注解
上面已经说了,每个切面注解都会有自己的作用范围,这个自然也不例外。RestControllerAdvice的作用范围是:单个项目中所有使用了RequestMapping(像PostMapping底层是使用了RequestMapping注解的也支持)的类都归他管,那归RestControllerAdvice他管了,已经清楚了,RestControllerAdvice这个注解要干什么呢?好像根据他的名字我们只能看到这是一个应用于Controller层的切面注解,其他就看不到了。其实该注解还需要与其他注解配合使用才有意义,单独的使用该注解是没有任何意义的,下面就来介绍下该注解都可以与哪些注解配合使用。
1.ExceptionHandler注解
RestControllerAdvice+ExceptionHandler这两个注解的组合,被用作项目的全局异常处理,笔者目前的项目就是这么用的;一旦项目中发生了异常,就会进入使用了RestControllerAdvice注解类中使用了ExceptionHandler注解的方法,我们可以在这里处理全局异常,将异常信息输出到指定的位置。并对所有的错误信息进行归置,下面是示例代码:
@Slf4j @CrossOrigin @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler public ResultDTO processException(Exception ex, HttpServletRequest request, HttpServletResponse response){ log.info("开始进入异常信息处理...."); ResultDTO resultDTO = GlobeExceptionUtil.returnException(ex, "************************"); log.info("结束异常信息处理...."); return resultDTO; } }
解释下这段代码的部分内容,slf4j是日志注解,CrossOrigin是允许跨域的注解均与此没有关系,GlobeExceptionUtil这是一个工具类,在该工具类中枚举了错误类型,并根据每种错误类型编辑文案返回前端,这样其实我们就完成了全局异常信息的控制,当然了工作量都在GlobeExceptionUtil这个工具类里,这只是个入口。RestControllerAdvice+ExceptionHandler这么用就对了。
2.InitBinder注解、ModelAttribute注解
这两个注解也是可以与RestControllerAdvice配合使用的,那这两个注解的作用是什么呢?
- InitBinder注解 用于将前端传递的参数进行分别绑定
- ModelAttribute注解 :获取InitBinder绑定的参数,对他进行属性绑定
举个列子展示下这两个参数的使用:
@Controller @RequestMapping("/test") public class TestController { // 绑定变量名字和属性,参数封装进类 @InitBinder("user") public void initBinderUser(WebDataBinder binder) { binder.setFieldDefaultPrefix("user."); } // 绑定变量名字和属性,参数封装进类 @InitBinder("addr") public void initBinderAddr(WebDataBinder binder) { binder.setFieldDefaultPrefix("addr."); } @RequestMapping("/test") @ResponseBody public Map<String,Object> test(HttpServletRequest request,@ModelAttribute("user") User user,@ModelAttribute("addr") Addr addr){ Map<String,Object> map=new HashMap<String,Object>(); map.put("user", user); map.put("addr", addr); return map; }
若是不理解,推荐看下这人的博客说的很好:SpringMvc @InitBinder 表单多对象精准绑定接收。
二、ControllerAdvice与RestContollerAdvice
这两个注解猛一看很相似,只是差了一个Rest。那他们有什么相似和区别呢?其实完全可以类比RestController与Controller的区别,RestControllerAdvice=ControllerAdvice+ResponseBody。这样就很清晰了ResponseBody的作用是将返回前端的参数转化成json格式,说白了就是以json数据与前端进行交互。所以ControllerAdvice与RestContollerAdvice的却别就是一个返回给前端的数据是json格式,一个返回的是对象,现在大部分项目前后端交互都是json格式,所以建议都是使用RestControllerAdvice与RestController等注解。