• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

SpringBoot统一响应,拦截Response返回

武飞扬头像
賈超陽~
帮助1

在开发中为了方便前端交互数据通常都会定义统一返回,我再下边的代码中有用到,例如

/**
 * @description 系统框架
 * @author JiaChaoYang
 * @Date 2022-03-03
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "响应结果",description = "响应结果")
public class ReturnMessage<T> {

    @ApiModelProperty(value = "响应状态")
    private int status;
    @ApiModelProperty(value = "响应消息")
    private String message = "OK";
    @ApiModelProperty(value = "响应数据")
    private T data;

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

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

    public T getData() {
        return data;
    }

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

个人感觉在一个个在Controller去写太麻烦,不如直接写Object,直接统一返回,就去学习了一下SpringBoot提供的ResponseBodyAdvice接口,注释超详细,精细到每个类,话不多说,直接上代码

PS:个人喜欢,实际开发中这样写的少,但是他可以防止刚接手项目的开发去随便返回(毕竟我刚开始做开发是就是这样去瞎返回的),只是去记录一下自己的学习历程

首先定义一个注解,用来标识这个方法或者类需不需要去统一返回

/**
* @Description: 忽略统一响应注解定义
* @Param:  * @Param null
* @Author: JiaChaoYang
* @Date: 2022/9/28 - 20:14
*/
@Target({ElementType.TYPE/*可以标注controller上边*/,ElementType.METHOD/*方法级别*/})
/*当前的注解需要保存到什么时候,标识在运行时*/
@Retention(RetentionPolicy.RUNTIME)
public @interface IgnoreResponseAdvice {
}

定义好注解后就可以开始进行统一拦截的代码编写了

/**
 * @program: app-web-qhy-oa-backend
 * @description: 统一响应,拦截Response返回,
 * @author: JiaChaoYang
 * @date: 2022-09-28 20:22
 **/
 //对RestController进行拦截
 //value是指定对那些路径进行拦截,如果都需要拦截的话不需要写value
@RestControllerAdvice(value = "com.xxx.xxx")
@SuppressWarnings("all")
public class CommonResponseDataAdvice implements ResponseBodyAdvice<Object>/*通过这个接口去拦截,Controller需要去返回Object*/ {

    /**
    * @Description: 判断是否需要对响应进行处理
    * @Param: [methodParameter, aClass]
    * @return: boolean
    * @Author: JiaChaoYang
    * @Date: 2022/9/28 - 20:29
    */
    @Override
    public boolean supports(MethodParameter methodParameter,
                            Class<? extends HttpMessageConverter<?>> aClass) {
        //如果类标识了自定义注解,不做处理
        if (methodParameter.getDeclaringClass().isAnnotationPresent(IgnoreResponseAdvice.class)){
            return false;
        }
        //如果方法标识了自定义注解,不做处理
        if (methodParameter.getMethod().isAnnotationPresent(IgnoreResponseAdvice.class)){
            return false;
        }
        return true;
    }

    /**
    * @Description: 响应给客户端之前做处理
    * @Param: [o controller的响应, methodParameter, mediaType, aClass, serverHttpRequest, serverHttpResponse]
    * @return: java.lang.Object
    * @Author: JiaChaoYang
    * @Date: 2022/9/28 - 20:32
    */
    @Override
    public Object beforeBodyWrite(Object o,
                                  MethodParameter methodParameter,
                                  MediaType mediaType,
                                  Class<? extends HttpMessageConverter<?>> aClass,
                                  ServerHttpRequest serverHttpRequest,
                                  ServerHttpResponse serverHttpResponse) {
        //定义最终的返回对象(这个是我自己定义的返回对象,大家可以是用自己的,这里就不贴出来了)
        ReturnMessage<Object> returnMessage = new ReturnMessage<>(SystemConstant.STATUS_SUCCESS,"ok",null);
        //如果方法返回为空(void)
        if (o == null){
        	//就去返回上方的默认返回对象
            return returnMessage;
            //如果响应本身就是ReturnMessage,即你指定的返回对象
        } else if (o instanceof ReturnMessage) {
        	//进行强转
            returnMessage = (ReturnMessage<Object>) o;
        } else {
        	//如果都不满足就将Controller返回的数据set到响应数据中
            returnMessage.setData(o);
        }
        //最终去返回自定义返回对象
        return returnMessage;
    }
学新通

到这里就结束了,代码很少,没什么技术含量,大家如果有什么问题请在评论区讨论或者直接私信我

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgcaiaf
系列文章
更多 icon
同类精品
更多 icon
继续加载