SpringBoot统一处理响应信息

简介: 在目前流行的前后端分离的软件项目中,JSON格式的数据交互是业界标准,后端开发一般要和前端约定好返回的数据格式,提高接口联调及整个软件项目的开发效率。

一、前言

在目前流行的前后端分离的软件项目中,JSON格式的数据交互是业界标准,后端开发一般要和前端约定好返回的数据格式,提高接口联调及整个软件项目的开发效率。

二、JSON格式

{
"code":200#响应代码"message": "成功", #响应信息"data": {  #返回的数据    }
}


三、代码实现

定义接口

packagecom.example.jenkins.entity;
/*** @Author : * @Description :* @Date 2022-3-15 23:05**/publicinterfaceBaseResultInterface {
/***  响应码* @return*/StringgetResultCode();
/*** 错误描述* @return*/StringgetResultMsg();
    }



定义枚举类

枚举类实现上面接口,统一定义返回状态码,和返回信息一一对应,我们可以约定xxx~xxx 为什么错误码,防止后期错误码重复,使用混乱不清楚

packagecom.example.jenkins.entity;
/*** @Author : guo yong* @Description :* @Date 2022-3-17 21:19**/publicenumResultCodeimplementsBaseResultInterface {
SUCCESS(200, "成功"),//成功//FAIL(400, "失败"),//失败BAD_REQUEST(400, "Bad Request"),
UNAUTHORIZED(401, "认证失败"),//未认证NOT_FOUND(404, "接口不存在"),//接口不存在INTERNAL_SERVER_ERROR(500, "系统繁忙"),//服务器内部错误METHOD_NOT_ALLOWED(405,"方法不被允许"),
/*参数错误:1001-1999*/PARAMS_IS_INVALID(1001, "参数无效"),
PARAMS_IS_BLANK(1002, "参数为空");
/*用户错误2001-2999*/privateIntegercode;
privateStringmessage;
ResultCode(intcode, Stringmessage) {
this.code=code;
this.message=message;
    }
@OverridepublicStringgetResultCode() {
returnthis.code.toString();
    }
@OverridepublicStringgetResultMsg() {
returnthis.message;
    }
}


定义返回对象

定义统一的返回对象包括code、message、data,其中code,和message都从定义的状态枚举中获取

这里有两个需要注意地方数据类型T data返回的是泛型类型而不是object类型,并且返回对象实现了Serializable接口

packagecom.example.jenkins.entity;
importlombok.AllArgsConstructor;
importlombok.Data;
importlombok.NoArgsConstructor;
importjava.io.Serializable;
/*** @Author : * @Description :* @Date 2022-3-15 23:04**/@Data@NoArgsConstructor@AllArgsConstructorpublicclassResultResponse<T>implementsSerializable {
/*** 响应代码*/privateStringcode;
/*** 响应消息*/privateStringmessage;
/*** 响应结果*/privateTdata;
publicResultResponse(BaseResultInterfaceerrorInfo) {
this.code=errorInfo.getResultCode();
this.message=errorInfo.getResultMsg();
    }
publicstaticResultResponsesuccess(){
ResultResponseresultResponse=newResultResponse(ResultCode.SUCCESS);
returnresultResponse;
    }
publicstatic<T>ResultResponsesuccess(Tt){
ResultResponseresultResponse=success();
resultResponse.setData(t);
returnresultResponse;
    }
publicstaticResultResponsefailure(BaseResultInterfaceresultCode){
ResultResponseresultResponse=newResultResponse(resultCode);
returnresultResponse;
    }
publicstatic<T>ResultResponsefailure(BaseResultInterfaceresultCode, Tt){
ResultResponseresultResponse=failure(resultCode);
resultResponse.setData(t);
returnresultResponse;
    }
}



这样在controller中很方便返回统一api格式了,如下所示:

@RestController//默认全部返回json@RequestMapping("/user")
publicclassUserController {
@GetMapping("/list")
publicResultgetUserInfo(){
Useru=newUser();
u.setUserId("1");
u.setUsername("apple");
u.setPassword("abcd1234");
returnResultResponse.success(u);
    }
}


如果按照这样开发,每个controller中的方法如果需要返回都写 ResultResponse.success(u)这句代码,能否进一步优化,对controller中的返回信息统一处理,controller中返回实际对象,对响应信息统一包装返回ResultResponse,答案是肯定的

四、优化处理

自定义注解

/*** @Author :* @Description :* @Date 2022-3-17 22:26**/@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented@Controller@ResponseBodypublic@interfaceSpringBootRestController {
}



实现接口

实现ResponseBodyAdvice接口,在响应信息返回之前对响应进行统一包装

/*** @Author : * @Description :* @Date 2022-3-17 22:04**/@Slf4j@RestControllerAdvicepublicclassResponseResultHandlerimplementsResponseBodyAdvice {
@Overridepublicbooleansupports(MethodParametermethodParameter, ClassaClass) {
System.out.println(aClass.getName());
//判断是否使用了自定义注解if(methodParameter.getDeclaringClass().isAnnotationPresent(SpringBootRestController.class)){
returntrue;
        }
returnfalse;
    }
@OverridepublicObjectbeforeBodyWrite(Objecto, MethodParametermethodParameter, MediaTypemediaType, ClassaClass, ServerHttpRequestserverHttpRequest, ServerHttpResponseserverHttpResponse) {
if (oinstanceofResultResponse) {
returno;
        } elseif (oinstanceofString) {
// string类型返回要单独json序列化返回一下,不然会报转换异常returnJSON.toJSONString(ResultResponse.success(o));
        } else {
returnResultResponse.success(o);
        }
    }
}


使用自定义注解

在controller中使用自定义注解,无需每个方法都返回ResultResponse

@SpringBootRestController//默认全部返回json@RequestMapping("/user")
publicclassUserController {
@GetMapping("/list")
publicUsergetUserInfo(){
Useru=newUser();
u.setUserId("1");
u.setUsername("apple");
u.setPassword("abcd1234");
returnu;  //返回user对象,无需每次都把返回的对象进行封装    }
}


相关文章
|
2月前
|
开发框架 前端开发 网络协议
Spring Boot结合Netty和WebSocket,实现后台向前端实时推送信息
【10月更文挑战第18天】 在现代互联网应用中,实时通信变得越来越重要。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为客户端和服务器之间的实时数据传输提供了一种高效的解决方案。Netty作为一个高性能、事件驱动的NIO框架,它基于Java NIO实现了异步和事件驱动的网络应用程序。Spring Boot是一个基于Spring框架的微服务开发框架,它提供了许多开箱即用的功能和简化配置的机制。本文将详细介绍如何使用Spring Boot集成Netty和WebSocket,实现后台向前端推送信息的功能。
344 1
|
4月前
|
SQL 监控 Java
在IDEA 、springboot中使用切面aop实现日志信息的记录到数据库
这篇文章介绍了如何在IDEA和Spring Boot中使用AOP技术实现日志信息的记录到数据库的详细步骤和代码示例。
在IDEA 、springboot中使用切面aop实现日志信息的记录到数据库
|
28天前
|
Java Spring 容器
SpringBoot读取配置文件的6种方式,包括:通过Environment、@PropertySource、@ConfigurationProperties、@Value读取配置信息
SpringBoot读取配置文件的6种方式,包括:通过Environment、@PropertySource、@ConfigurationProperties、@Value读取配置信息
57 3
|
2月前
|
JSON 前端开发 Java
Spring Boot框架中的响应与分层解耦架构
在Spring Boot框架中,响应与分层解耦架构是两个核心概念,它们共同促进了应用程序的高效性、可维护性和可扩展性。
54 3
|
2月前
|
XML Java 应用服务中间件
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
186 2
|
4月前
|
前端开发 数据库
SpringBoot+Vue实现商品不能重复加入购物车、购物车中展示商品的信息、删除商品重点提示等操作。如何点击图片实现图片放大
这篇文章介绍了如何在SpringBoot+Vue框架下实现购物车功能,包括防止商品重复加入、展示商品信息、删除商品时的提示,以及点击图片放大的前端实现。
SpringBoot+Vue实现商品不能重复加入购物车、购物车中展示商品的信息、删除商品重点提示等操作。如何点击图片实现图片放大
|
4月前
|
Java 数据库 开发者
"揭秘!SpringBoot+事务钩子,如何携手打造零差错、秒级响应的高效支付系统,让你的业务飞起来!"
【8月更文挑战第11天】构建高效稳定的支付系统时,Spring Boot凭借其快速开发与丰富生态成为优选框架。通过集成Spring事务管理抽象,@Transactional注解简化了数据库事务处理。针对复杂业务,可利用`TransactionSynchronizationManager`和`TransactionSynchronization`接口自定义事务钩子函数,在事务不同阶段执行特定逻辑,如支付成功或失败时的通知,确保数据一致性与业务完整性。
102 4
|
4月前
|
JSON JavaScript 前端开发
基于SpringBoot + Vue实现单个文件上传(带上Token和其它表单信息)的前后端完整过程
本文介绍了在SpringBoot + Vue项目中实现单个文件上传的同时携带Token和其它表单信息的前后端完整流程,包括后端SpringBoot的文件上传处理和前端Vue使用FormData进行表单数据和文件的上传。
255 0
基于SpringBoot + Vue实现单个文件上传(带上Token和其它表单信息)的前后端完整过程
|
4月前
|
数据库
elementUi使用dialog的进行信息的添加、删除表格数据时进行信息提示。删除或者添加成功的信息提示(SpringBoot+Vue+MybatisPlus)
这篇文章介绍了如何在基于SpringBoot+Vue+MybatisPlus的项目中使用elementUI的dialog组件进行用户信息的添加和删除操作,包括弹窗表单的设置、信息提交、数据库操作以及删除前的信息提示和确认。
elementUi使用dialog的进行信息的添加、删除表格数据时进行信息提示。删除或者添加成功的信息提示(SpringBoot+Vue+MybatisPlus)
|
4月前
|
XML Java Maven
logback在springBoot项目中的使用 springboot中使用日志进行持久化保存日志信息
这篇文章详细介绍了如何在Spring Boot项目中使用logback进行日志记录,包括Maven依赖配置、logback配置文件的编写,以及实现的日志持久化和控制台输出效果。
logback在springBoot项目中的使用 springboot中使用日志进行持久化保存日志信息