统一处理controller层接口返回的数据

本文介绍了如何使用@RestControllerAdvice和ResponseBodyAdvice在Java Spring MVC中对Controller层的接口返回数据进行统一处理,避免重复封装返回对象。详细解释了ResponseBodyAdvice的工作原理,并通过例子展示了其实现方式。同时,文章还分析了返回字符串时可能出现的ClassCastException问题及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@RestControllerAdvice和ResponseBodyAdvice统一处理controller层接口返回

1. 理论知识

要对controller层的内容进行统一返回,需要用到 @ControllerAdvice ResponseBodyAdvice

  • @RestControllerAdvice

一个方便的注释,它本身带有@ControllerAdvice和@ResponseBody注释,携带此注释的类型被视为控制器通知 总之,它就是对controller层的方法加强

  • ResponseBodyAdvice

允许在@ResponseBody或ResponseEntity控制器方法执行之后,但在使用HttpMessageConverter编写body之前定制响应

简单理解:ResponseBodyAdvice接口是在controller层方法执行之后,在response返回给前端数据之前对reponse的数据进行处理,可以对数据进行统一的处理,从而可以使返回数据格式一致。

2. 举例说明

  • 2.1 编写统一返回数据格式代码
@RestControllerAdvice
@Slf4j
public class UnifiedAdvice implements ResponseBodyAdvice {
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        //若加了@ResponseNotIntercept 则该方法不用做统一的拦截
        AnnotatedElement annotatedElement = returnType.getParameterType();
        ResponseNotIntercept annotation = AnnotationUtils.findAnnotation(annotatedElement, ResponseNotIntercept.class);
        return annotation == null;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        if (body instanceof CommonResult) return body;
        CommonResult<Object> objectCommonResult = new CommonResult<>(ResultCode.SUCCESS, body);
        //若未封装
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值