SpringBoot统一响应,拦截Response返回
在开发中为了方便前端交互数据通常都会定义统一返回,我再下边的代码中有用到,例如
/**
* @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
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01