RestControllerAdvice注解与全局异常处理

31
五月
2021

RestControllerAdvice注解与全局异常处理

  • 一、RestControllerAdvice注解
    • 1.ExceptionHandler注解
    • 2.InitBinder注解、ModelAttribute注解
  • 二、ControllerAdvice与RestContollerAdvice

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

一、RestControllerAdvice注解

上面已经说了,每个切面注解都会有自己的作用范围,这个自然也不例外。RestControllerAdvice的作用范围是:单个项目中所有使用了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等注解。

TAG

网友评论

共有访客发表了评论
请登录后再发布评论,和谐社会,请文明发言,谢谢合作! 立即登录 注册会员