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对象,无需每次都把返回的对象进行封装    }
}


目录
打赏
0
0
0
0
6
分享
相关文章
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
本课主要讲解Spring Boot项目中的属性配置方法。在实际开发中,测试与生产环境的配置往往不同,因此不应将配置信息硬编码在代码中,而应使用配置文件管理,如`application.yml`。例如,在微服务架构下,可通过配置文件设置调用其他服务的地址(如订单服务端口8002),并利用`@Value`注解在代码中读取这些配置值。这种方式使项目更灵活,便于后续修改和维护。
66 0
Spring Boot结合Netty和WebSocket,实现后台向前端实时推送信息
【10月更文挑战第18天】 在现代互联网应用中,实时通信变得越来越重要。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为客户端和服务器之间的实时数据传输提供了一种高效的解决方案。Netty作为一个高性能、事件驱动的NIO框架,它基于Java NIO实现了异步和事件驱动的网络应用程序。Spring Boot是一个基于Spring框架的微服务开发框架,它提供了许多开箱即用的功能和简化配置的机制。本文将详细介绍如何使用Spring Boot集成Netty和WebSocket,实现后台向前端推送信息的功能。
1981 1
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
在微服务架构中,随着业务复杂度增加,项目可能需要调用多个微服务。为避免使用`@Value`注解逐一引入配置的繁琐,可通过定义配置类(如`MicroServiceUrl`)并结合`@ConfigurationProperties`注解实现批量管理。此方法需在配置文件中设置微服务地址(如订单、用户、购物车服务),并通过`@Component`将配置类纳入Spring容器。最后,在Controller中通过`@Resource`注入配置类即可便捷使用,提升代码可维护性。
64 0
SpringBoot 响应请求是串行还是并行?
Spring Boot 在默认情况下通过 Servlet 容器的线程池实现并行处理 HTTP 请求。通过适当的线程池配置,可以进一步优化并发性能。此外,Spring Boot 提供了异步处理机制(如使用 `@Async` 注解)和反应式编程模型(Spring WebFlux),使得应用能够处理更高的并发负载。在具体项目中,可以根据需求选择合适的处理模型,以充分利用 Spring Boot 的并发处理能力。
159 21
SpringBoot读取配置文件的6种方式,包括:通过Environment、@PropertySource、@ConfigurationProperties、@Value读取配置信息
SpringBoot读取配置文件的6种方式,包括:通过Environment、@PropertySource、@ConfigurationProperties、@Value读取配置信息
567 3
Spring Boot框架中的响应与分层解耦架构
在Spring Boot框架中,响应与分层解耦架构是两个核心概念,它们共同促进了应用程序的高效性、可维护性和可扩展性。
173 3
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
509 2
SpringBoot+Vue实现商品不能重复加入购物车、购物车中展示商品的信息、删除商品重点提示等操作。如何点击图片实现图片放大
这篇文章介绍了如何在SpringBoot+Vue框架下实现购物车功能,包括防止商品重复加入、展示商品信息、删除商品时的提示,以及点击图片放大的前端实现。
SpringBoot+Vue实现商品不能重复加入购物车、购物车中展示商品的信息、删除商品重点提示等操作。如何点击图片实现图片放大
基于SpringBoot + Vue实现单个文件上传(带上Token和其它表单信息)的前后端完整过程
本文介绍了在SpringBoot + Vue项目中实现单个文件上传的同时携带Token和其它表单信息的前后端完整流程,包括后端SpringBoot的文件上传处理和前端Vue使用FormData进行表单数据和文件的上传。
527 0
基于SpringBoot + Vue实现单个文件上传(带上Token和其它表单信息)的前后端完整过程
elementUi使用dialog的进行信息的添加、删除表格数据时进行信息提示。删除或者添加成功的信息提示(SpringBoot+Vue+MybatisPlus)
这篇文章介绍了如何在基于SpringBoot+Vue+MybatisPlus的项目中使用elementUI的dialog组件进行用户信息的添加和删除操作,包括弹窗表单的设置、信息提交、数据库操作以及删除前的信息提示和确认。
elementUi使用dialog的进行信息的添加、删除表格数据时进行信息提示。删除或者添加成功的信息提示(SpringBoot+Vue+MybatisPlus)
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问