ResponseBodyAdvice实现统一返回响应体格式

本文介绍了如何通过实现ResponseBodyAdvice接口,对Controller返回值进行统一处理,包括beforeBodyWrite方法的使用,以及如何根据方法类型和HttpMessageConverter判断处理逻辑。最终实现了返回体的标准化输出,如包含'role'、'data'等字段。

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

前言

  实现ResponseBodyAdvice<T>接口是对controller的返回值后,返回浏览器等客户端前,对返回结果进行的处理操作。接口有两个方法可实现:

  1. boolean supports
  2. Object beforeBodyWrite

  使用@ControllerAdvice是@Component注解的一个延伸注解,Spring会自动扫描并检测被@ControllerAdvice所标注的类。这里我们自动检测路径下的Controller类,对指定的controller进行统一增强处理。同理的,我们也可以用它进行统一异常处理。具体可查看@ControllerAdvice详情。

@ControllerAdvice(basePackages = "com.cbry.controller")
@Component
public class InterceptResponse implements ResponseBodyAdvice<Object> {
	public boolean supports...
	public Object beforeBodyWrite...
}


supports和beforeBodyWrite

  supports:根据类和方法来判断是否需要执行beforeBodyWrite方法进行response处理;

  beforeBodyWrite:对response结果进行的逻辑处理操作;

@Override
//判断是否要执行beforeBodyWrite方法,true为执行,false不执行
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
    return true;
}

@Override
 //对response处理的执行方法
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
	return null;
}


supports

  controller返回的方法类型(MethodParameter)和HttpMessageConverter 类型(HttpMessageConverter),决定了下面的beforeBodyWrite业务逻辑处理是否生效。

  在supports方法里面我们编写是否生效的逻辑代码。

 @Override
    public boolean supports(MethodParameter methodParameter,
                            Class<? extends HttpMessageConverter<?>> aClass) {
        return methodParameter.hasMethodAnnotation(ResponseBody.class);
    }


beforeBodyWrite

  对于controller返回的结果值:Object o 参数, 我们进行统一的格式返回结果处理。 并且可以使用request参数来获取对应域的相关信息,比如说用户信息。返回信息统一封装到一个data里面。

@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {

       ServletServerHttpRequest  request = (ServletServerHttpRequest) serverHttpRequest;
       HttpServletRequest servletRequest = request.getServletRequest();
	   String role = servletRequest.getAttribute(Constants.USERROLE).toString();
	   
	   Map<String,Object> res = new HashMap<>();
       res.put("role",role);
       res.put("data",o);
       return res;
}

  如果有编写统一的实体类,比如说DataResult,controller统一返回该类,其实可以:

DataResult dataResult = (DataResult)o;
//do something
return o;


统一返回体效果

{“message”:“OK”,“data”:{“pageNo”:1,“pageSize”:10},“role”:“admin”,“curAccount”:“cbry”,“status”:200}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

长臂人猿

客官们众筹请博主喝杯奶茶吧

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

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

打赏作者

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

抵扣说明:

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

余额充值