RestControllerAdvice注解与全局异常处理

简介: 从该注解的名字可以看到,这是一个与切面有关的注解,事实上也是如此,我们都知道切面的注解肯定都有个作用范围,切面类的注解只能对其作用范围内的操作,实现切面操作。那RestCntrollerAdvice的作用范围是什么呢?

前言:从该注解的名字可以看到,这是一个与切面有关的注解,事实上也是如此,我们都知道切面的注解肯定都有个作用范围,切面类的注解只能对其作用范围内的操作,实现切面操作。那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等注解。


相关文章
|
4天前
|
前端开发 Java UED
SpringMVC全局异常处理+拦截器使用+参数校验
通过使用 SpringMVC 的全局异常处理、拦截器和参数校验,可以有效提升 Web 应用程序的安全性、稳定性和用户体验。这些技术的合理应用,不仅可以保证代码的健壮性,还能提高代码的可维护性,为开发高质量的 Web 应用程序提供了坚实的基础。
19 6
|
3月前
|
运维 Devops
全局异常处理
全局异常处理
36 0
SpringBoot 如何使用 @ExceptionHandler 注解进行局部异常处理
SpringBoot 如何使用 @ExceptionHandler 注解进行局部异常处理
|
6月前
|
Java
SpringBoot全局异常@RestControllerAdvice全局异常
SpringBoot全局异常@RestControllerAdvice全局异常
34 0
|
6月前
|
前端开发
Nestjs(五)异常处理方式(异常过滤器)
Nestjs(五)异常处理方式(异常过滤器)
132 0
|
6月前
|
前端开发 IDE Java
使用aop实现全局异常处理
使用aop实现全局异常处理
150 0
|
11月前
|
JSON 前端开发 Java
SpringMVC中异常处理与ControllerAdvice捕捉全局异常
SpringMVC中异常处理与ControllerAdvice捕捉全局异常
92 0
|
JSON 安全 Java
Spring Boot之全局异常处理:404异常为何捕获不到?
Spring Boot之全局异常处理:404异常为何捕获不到?
1588 0
Spring Boot之全局异常处理:404异常为何捕获不到?