spring切面接口ResponseBodyAdvice的分析和使用

ResponseBodyAdvice接口属于springMVC 和springBoot框架基础的底层切面接口;实现这个接口的类,可以修改直接作为 ResponseBody类型处理器的返回值,即进行功能增强。

1、有两种类型的处理器会将返回值作为ResponseBody

  • 返回值为HpptEntity
  • 加了@ResponseBody或@RestController注解,

实现了这个接口的类,处理返回的json值在传递给 HttpMessageConverter之前;应用场景在spring项目开发过程中,对controller层返回值进行修改增强处理。比如返回值5,需要封装成

{"code":"0","data":5,,"msg":"success"}格式返回前端

接口源码如下:

public interface ResponseBodyAdvice<T> {

    / * *
    *该组件是否支持给定的控制器方法返回类型
    *和选择的{@code HttpMessageConverter}类型。
    返回类型
    * @param converterType选择的转换器类型
    * @return {@code true}如果{@link #beforeBodyWrite}应该被调用;
    * {@code false}否则
    * /
	boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType);

	 
    / * *
    *在{@code HttpMessageConverter}被选中之后和之前调用
    *它的write方法被调用。
    * @param body要写入的主体
    控制器方法的返回类型:
    * @param selectedContentType通过内容协商选择的内容类型
    * @param selectedConverterType选择写入响应的转换器类型
    * @param request当前请求
    * @param response当前响应
    * @return传入的主体或修改过的(可能是新的)实例
   * /
	@Nullable
	T beforeBodyWrite(@Nullable T body, MethodParameter returnType, MediaType selectedContentType,
			Class<? extends HttpMessageConverter<?>> selectedConverterType,
			ServerHttpRequest request, ServerHttpResponse response);

}

2、应用场景在spring项目开发过程中,对controller层返回值进行修改增强处理。比如返回值5,需要封装成 {"code":"0","data":5,,"msg":"success"}  格式返回前端

controller层业务代码:

@RestController //此注解包含@ResponseBody注解
@RequestMapping("/nandao")
public class ResponseBodyAdviceController {

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public int hello() {
         //业务代码省略
        return 5;
    }

}

实现ResponseBodyAdvice接口的切面类:


/**
*此注解针对controller层的类做增强功能,即对加了@RestController注解的类进行处理
*/
@ControllerAdvice(annotations = RestController.class)
public class RestResultWrapper implements ResponseBodyAdvice<Object> {
    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
                                  ServerHttpResponse response) {

            //定义一个统一的返回类
            RestResult responseResult = new RestResult( "0", body, "success");
             //如果handler处理类的返回类型是String(即控制层的返回值类型),为了保证一致性,这里需要将ResponseResult转回去
            if(body instanceof String) {
                return JSON.toJSONString(responseResult);
            }
           //封装后的数据返回到前端页面
            return JSONObject.toJSON(responseResult);
       
    }


}

返回公共类的创建:

/**
 * @author nandao
 * Created on 2021/1/12-21:47.
 * 统一返回Rest风格的数据结构
 */
public class RestResult<T>  implements Serializable {

    /**
     * 成功的code码
     */
    private String code = "2000";
    /**
     * 成功时返回的数据,失败时返回具体的异常信息
     */
    private T data;
    /**
     * 请求失败返回的提示信息,给前端进行页面展示的信息
     */
    private String message ;

    public RestResult() {
    }

    @Override
    public String toString() {

        return "RestResult{" +
                "code='" + code + '\'' +
                ", data=" + data +
                ", message=" + message +
                '}';
    }

    public RestResult(String code, T data, String message) {
        this.code = code;
        this.data = data;
        this.message = message;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

到此切面增强功能就实现了,可以直接在实战项目中使用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

寅灯

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值