什么是ResponseBodyAdvice接口以及@ControllerAdvice的配合使用

文章目录

  • 前言
  • 什么是ResponseBodyAdvice接口
  • @ControllerAdvice
    • @ExceptionHandler
    • @InitBinder
    • @ModelAttribute
    • 作用范围

前言

好多小伙伴对@RestController和@Controller+@ResponseBody的使用应该不会陌生,每一个java后端开发工程师都会用到这几个注解。这里不过多啰嗦(不明白的小伙伴自行百度一下吧)

进入今天的主题,每次我们返回的对象是如果在前端转化为json字符串的呢?

通过上面的注解可以实现,但是不是我们今天的菜。今天我们要说的就是通过ResponseBodyAdvice来实现更改返回对象的操作

什么是ResponseBodyAdvice接口

说的简单点实现ResponseBodyAdvice接口,其实就是对添加了@RestController(即@Controller+@ResponseBody)注解的Controller处理器将要返回的值进行一步增强处理。

这也就是我们常说的采用了AOP的思想,对返回值进行一定范围的更改。

接下来我们看一下下面的代码

@ControllerAdvice
public class ApiResBodyAdvice implements ResponseBodyAdvice {
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }
    
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                                  Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        return ApiResultBodyAdviceUtils.beforeBodyWrite(body);
    }
}

代码中我们可以看到有@ControllerAdvice注解(这个我们接下来会讲解)、supports方法(用来判断哪些需要拦截)、beforeBodyWrite方法(拦截返回数据处理,在这个方法中来完成我们自己的处理逻辑)

@ControllerAdvice

上面的接口添加了@ControllerAdviece其实就是对@Controller的类植入一个增强功能通知。

对@ControllerAdvice来说,其实他的本质上就是一个@Component,所以他也会被当成一个组件来扫描。

加了@ControllerAdvice的类就是为那些声明了(@ExceptionHandler、@InitBinder 或 @ModelAttribute)方法的类而提供的更加较为专业化的@Component , 使它能够为多个 Controller类所共享。

简单点说就是,定义了拦截规则,通过他来拦截,拦截之后,具体的处理逻辑在通过@ExceptionHandler、@InitBinder 或 @ModelAttribute这三个注解以及被其注解的方法来实现特殊的需求。

@ExceptionHandler

通过他标注的方法适用于捕获Controller中抛出的不同类型的异常,从而达到异常全局处理的效果(适用于自定义异常处理)

@InitBinder

通过他标注的方法适用于请求中注册自定义参数的解析,从而达到自定义请求参数格式的效果

@ModelAttribute

通过他标注的方法用来表示此方法会在执行目标Controller方法之前执行

作用范围

@ControllerAdvice提供了多种指定Advice规则的方式,默认什么都不写,则是Advice所有Controller

欢迎大家点击下方卡片,关注《coder练习生》

你可能感兴趣的:(java,java,开发语言)