SpringBoot统一响应,拦截Response返回
使用SpringBoot提供的ResponseBodyAdvice实现返回数据统一拦截
·
在开发中为了方便前端交互数据通常都会定义统一返回,我再下边的代码中有用到,例如
/**
* @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;
}
到这里就结束了,代码很少,没什么技术含量,大家如果有什么问题请在评论区讨论或者直接私信我
#【国庆活动】带上CSDN一起玩转国庆#
更多推荐
已为社区贡献3条内容
所有评论(0)