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

前言

好多小伙伴对@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练习生》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ybb_ymm

你的鼓励会是对我最大的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值