当前位置:首页 > 科技  > 软件

拒绝写重复代码,试试这套开源的 SpringBoot 组件,效率翻倍

来源: 责编: 时间:2023-12-25 09:35:46 374观看
导读一、简介Graceful Response是一个Spring Boot技术栈下的优雅响应处理器,提供一站式统一返回值封装、全局异常处理、自定义异常错误码等功能,使用Graceful Response进行web接口开发不仅可以节省大量的时间,还可以提高代码

一、简介

Graceful Response是一个Spring Boot技术栈下的优雅响应处理器,提供一站式统一返回值封装、全局异常处理、自定义异常错误码等功能,使用Graceful Response进行web接口开发不仅可以节省大量的时间,还可以提高代码质量,使代码逻辑更清晰。luN28资讯网——每日最新资讯28at.com

强烈推荐你花3分钟学会它!luN28资讯网——每日最新资讯28at.com

luN28资讯网——每日最新资讯28at.com

本项目案例工程代码:https://github.com/feiniaojin/graceful-response-example.git ,注意选择最新版本的分支。luN28资讯网——每日最新资讯28at.com

Spring Boot版本
luN28资讯网——每日最新资讯28at.com

Graceful Response版本
luN28资讯网——每日最新资讯28at.com

graceful-response-example分支
luN28资讯网——每日最新资讯28at.com

2.x
luN28资讯网——每日最新资讯28at.com

3.2.1-boot2
luN28资讯网——每日最新资讯28at.com

3.2.0-boot2
luN28资讯网——每日最新资讯28at.com

3.x
luN28资讯网——每日最新资讯28at.com

3.2.1-boot3
luN28资讯网——每日最新资讯28at.com

3.2.0-boot3
luN28资讯网——每日最新资讯28at.com

注意,3.2.1-boot2版本的GracefulResponse源码由单独的仓库进行维护,地址为:https://github.com/feiniaojin/graceful-response-boot2。luN28资讯网——每日最新资讯28at.com

luN28资讯网——每日最新资讯28at.com

3.2.1-boot2和3.2.1-boot3除了支持的SpringBoot版本不一样,其他实现完全一致,Maven引用时只需要根据对应的SpringBoot版本选择Graceful Response的version即可,两者的groupId、artifactId是一致的。luN28资讯网——每日最新资讯28at.com

二、快速入门

1.Spring Boot接口开发现状

目前,业界使用Spring Boot进行接口开发时,往往存在效率底下、重复劳动、可读性差等问题。以下伪代码相信大家非常熟悉,我们大部分项目的Controller接口都是这样的。luN28资讯网——每日最新资讯28at.com

@Controllerpublic class Controller {    @GetMapping("/query")    @ResponseBody    public Response query(Map<String, Object> paramMap) {        Response res = new Response();        try {            //1.校验params参数合法性,包括非空校验、长度校验等            if (illegal(paramMap)) {                res.setCode(1);                res.setMsg("error");                return res;            }            //2.调用Service的一系列操作,得到查询结果            Object data = service.query(params);            //3.将操作结果设置到res对象中            res.setData(data);            res.setCode(0);            res.setMsg("ok");            return res;        } catch (Exception e) {            //4.异常处理:一堆丑陋的try...catch,如果有错误码的,还需要手工填充错误码            res.setCode(1);            res.setMsg("error");            return res;        }    }}

这段伪代码存在什么样的问题呢?luN28资讯网——每日最新资讯28at.com

第一个问题,效率低下。 Controller层的代码应该尽量简洁,上面的伪代码其实只是为了将数据查询的结果进行封装,使其以统一的格式进行返回。例如以下格式的响应体:luN28资讯网——每日最新资讯28at.com

{  "code": 0,  "msg": "ok",  "data": {    "id": 1,    "name": "username"  }}

查询过程中如果发生异常,需要在Controller进行手工捕获,根据捕获的异常人工地设置错误码,当然,也用同样的格式封装错误码进行返回。luN28资讯网——每日最新资讯28at.com

可以看到,除了调用service层的query方法这一行,其他大部分的代码都执行进行结果的封装,大量的冗余、低价值的代码导致我们的开发活动效率很低。luN28资讯网——每日最新资讯28at.com

第二个问题,重复劳动。 以上捕获异常、封装执行结果的操作,每个接口都会进行一次,因此造成大量重复劳动。luN28资讯网——每日最新资讯28at.com

第三个问题,可读性低。 上面的核心代码被淹没在许多冗余代码中,很难阅读,如同大海捞针。luN28资讯网——每日最新资讯28at.com

我们可以通过Graceful Response这个组件解决这样的问题。luN28资讯网——每日最新资讯28at.com

2. 快速入门

(1) 引入Graceful Response组件

Graceful Response已发布至maven中央仓库,我们可以直接引入到项目中。luN28资讯网——每日最新资讯28at.com

maven依赖如下:luN28资讯网——每日最新资讯28at.com

<dependency>    <groupId>com.feiniaojin</groupId>    <artifactId>graceful-response</artifactId>    <version>{latest.version}</version></dependency>

Spring Boot版本
luN28资讯网——每日最新资讯28at.com

Graceful Response最新版本
luN28资讯网——每日最新资讯28at.com

2.x
luN28资讯网——每日最新资讯28at.com

3.2.1-boot2
luN28资讯网——每日最新资讯28at.com

3.x
luN28资讯网——每日最新资讯28at.com

3.2.1-boot3
luN28资讯网——每日最新资讯28at.com

(2) 启用Graceful ResponseluN28资讯网——每日最新资讯28at.com

在启动类中引入@EnableGracefulResponse注解,即可启用Graceful Response组件。luN28资讯网——每日最新资讯28at.com

@EnableGracefulResponse@SpringBootApplicationpublic class ExampleApplication {    public static void main(String[] args) {        SpringApplication.run(ExampleApplication.class, args);    }}

(3) Controller层luN28资讯网——每日最新资讯28at.com

引入Graceful Response后,我们不需要再手工进行查询结果的封装,直接返回实际结果即可,Graceful Response会自动完成封装的操作。luN28资讯网——每日最新资讯28at.com

Controller层示例如下:luN28资讯网——每日最新资讯28at.com

@Controllerpublic class Controller {    @RequestMapping("/get")    @ResponseBody    public UserInfoView get(Long id) {        log.info("id={}", id);        return UserInfoView.builder().id(id).name("name" + id).build();    }}

在示例代码中,Controller层的方法直接返回了UserInfoView对象,没有进行封装的操作,但经过Graceful Response处理后,我们还是得到了以下的响应结果。luN28资讯网——每日最新资讯28at.com

{  "status": {    "code": "0",    "msg": "ok"  },  "payload": {    "id": 1,    "name": "name1"  }}

而对于命令操作(Command)尽量不返回数据,因此command操作的方法的返回值应该是void,Graceful Response对于对于返回值类型void的方法,也会自动进行封装。luN28资讯网——每日最新资讯28at.com

public class Controller {    @RequestMapping("/command")    @ResponseBody    public void command() {        //业务操作    }}

成功调用该接口,将得到:luN28资讯网——每日最新资讯28at.com

{  "status": {    "code": "200",    "msg": "success"  },  "payload": {}}

(3) Service层luN28资讯网——每日最新资讯28at.com

在引入Graceful Response前,有的开发者在定义Service层的方法时,为了在接口中返回异常码,干脆直接将Service层方法定义为Response,淹没了方法的正常返回值。luN28资讯网——每日最新资讯28at.com

Response的代码如下。luN28资讯网——每日最新资讯28at.com

//lombok注解@Datapublic class Response {    private String code;    private String msg;    private Object data;}

直接返回Response的Service层方法:luN28资讯网——每日最新资讯28at.com

/** * 直接返回Reponse的Service * 不规范 */public interface Service {    public Reponse commandMethod(Command command);}

Graceful Response引入@ExceptionMapper注解,通过该注解将异常和错误码关联起来,这样Service方法就不需要再维护Response的响应码了,直接抛出业务异常,由Graceful Response进行异常和响应码的关联。搜索我是程序汪公众号,回复“面试宝典”,送你一份Java面试宝典luN28资讯网——每日最新资讯28at.com

@ExceptionMapper的用法如下。luN28资讯网——每日最新资讯28at.com

/** * NotFoundException的定义,使用@ExceptionMapper注解修饰 * code:代表接口的异常码 * msg:代表接口的异常提示 */@ExceptionMapper(code = "1404", msg = "找不到对象")public class NotFoundException extends RuntimeException {}

Service接口定义:luN28资讯网——每日最新资讯28at.com

public interface QueryService {    UserInfoView queryOne(Query query);}

Service接口实现:luN28资讯网——每日最新资讯28at.com

public class QueryServiceImpl implements QueryService {    @Resource    private UserInfoMapper mapper;    public UserInfoView queryOne(Query query) {        UserInfo userInfo = mapper.findOne(query.getId());        if (Objects.isNull(userInfo)) {            //这里直接抛自定义异常            throw new NotFoundException();        }        //……后续业务操作    }}

当Service层的queryOne方法抛出NotFoundException时,Graceful Response会进行异常捕获,并将NotFoundException对应的异常码和异常信息封装到统一的响应对象中,最终接口返回以下JSON。luN28资讯网——每日最新资讯28at.com

{  "status": {    "code": "1404",    "msg": "找不到对象"  },  "payload": {}}

(5) 参数校验

Graceful Response对JSR-303数据校验规范和Hibernate Validator进行了增强,Graceful Response自身不提供参数校验的功能,但是用户使用了Hibernate Validator后,Graceful Response可以通过@ValidationStatusCode注解为参数校验结果提供响应码,并将其统一封装返回。luN28资讯网——每日最新资讯28at.com

例如以下的UserInfoQuery:luN28资讯网——每日最新资讯28at.com

@Datapublic class UserInfoQuery {    @NotNull(message = "userName is null !")    @Length(min = 6, max = 12)    @ValidationStatusCode(code = "520")    private String userName;}
  • UserInfoQuery对象中定义了@NotNull和@Length两个校验规则,在未引入Graceful Response的情况下,会直接抛出异常;
  • 在引入Graceful Response但是没有加入@ValidationStatusCode注解的情况下,会以默认的错误码进行返回;

在上面的UserInfoQuery中由于使用了@ValidationStatusCode注解,并指定异常码为520,则当userName字段任意校验不通过时,都会使用异常码520进行返回,如下:luN28资讯网——每日最新资讯28at.com

{  "status": {    "code": "520",    "msg": "userName is null !"  },  "payload": {}}

而对于Controller层直接校验方法入参的场景,Graceful Response也进行了增强,如以下Controller:luN28资讯网——每日最新资讯28at.com

public class Controller {    @RequestMapping("/validateMethodParam")    @ResponseBody    @ValidationStatusCode(code = "1314")    public void validateMethodParam(            @NotNull(message = "userId不能为空") Long userId,            @NotNull(message = "userName不能为空") Long userName) {        //省略业务逻辑    }}

如果该方法入参校验触发了userId和userName的校验异常,将以错误码1314进行返回,如下:luN28资讯网——每日最新资讯28at.com

{  "status": {    "code": "1314",    "msg": "userId不能为空"  },  "payload": {}}

(6) 自定义Response格式

Graceful Response内置了两种风格的响应格式,并通过graceful-response.response-style进行配置。luN28资讯网——每日最新资讯28at.com

graceful-response.response-style=0,或者不配置(默认情况),将以以下的格式进行返回:luN28资讯网——每日最新资讯28at.com

{  "status": {    "code": 1007,    "msg": "有内鬼,终止交易"  },  "payload": {  }}

graceful-response.response-style=1,将以以下的格式进行返回:luN28资讯网——每日最新资讯28at.com

{  "code": "1404",  "msg": "not found",  "data": {  }}

如果这两种格式均不满足业务需要,Graceful Response也支持用户自定义响应体,关于自定义响应体的技术实现,请到自定义Response格式进行了解。luN28资讯网——每日最新资讯28at.com

本项目提供的进阶功能,包括:luN28资讯网——每日最新资讯28at.com

  • 第三方组件汽车(Swagger、执行器等)
  • 自定义响应
  • 异常请求放行
  • 异常别名
  • 常用配置项

目前该组件在GitHub上已经有两百多Star,很多朋友已经开始用了,大家可以通过下方链接了解下:https://github.com/feiniaojin/graceful-response。luN28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-53350-0.html拒绝写重复代码,试试这套开源的 SpringBoot 组件,效率翻倍

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: C++函数模板详解,轻松实现通用函数

下一篇: 使用互斥锁(Mutex)管理共享资源

标签:
  • 热门焦点
  • vivo TWS Air开箱体验:真轻 臻好听

    在vivo S15系列新机的发布会上,vivo的最新款真无线蓝牙耳机vivo TWS Air也一同发布,本次就这款耳机新品给大家带来一个简单的分享。外包装盒上,vivo TWS Air保持了vivo自家产
  • 六大权益!华为8月服务日开启:手机免费贴膜、维修免人工费

    8月5日消息,一年一度的华为开发者大会2023(Together)日前在松山湖拉开帷幕,与此同时,华为8月服务日也式开启,到店可享六大专属权益。华为用户可在华为商城Ap
  • 企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • 学习JavaScript的10个理由...

    作者 | Simplilearn编译 | 王瑞平当你决心学习一门语言的时候,很难选择到底应该学习哪一门,常用的语言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 只需五步,使用start.spring.io快速入门Spring编程

    步骤1打开https://start.spring.io/,按照屏幕截图中的内容创建项目,添加 Spring Web 依赖项,并单击“生成”按钮下载 .zip 文件,为下一步做准备。请在进入步骤2之前进行解压。图
  • 一篇文章带你了解 CSS 属性选择器

    属性选择器对带有指定属性的 HTML 元素设置样式。可以为拥有指定属性的 HTML 元素设置样式,而不仅限于 class 和 id 属性。一、了解属性选择器CSS属性选择器提供了一种简单而
  • 自律,给不了Keep自由!

    来源 | 互联网品牌官作者 | 李大为编排 | 又耳 审核 | 谷晓辉自律能不能给用户自由暂时不好说,但大概率不能给Keep自由。近日,全球最大的在线健身平台Keep正式登陆港交所,努力
  • 阿里瓴羊One推出背后,零售企业迎数字化新解

    作者:刘旷近年来随着数字经济的高速发展,各式各样的SaaS应用服务更是层出不穷,但本质上SaaS大多局限于单一业务流层面,对用户核心关切的增长问题等则没有提供更好的解法。在Saa
  • iQOO Neo8系列新品发布会

    旗舰双芯 更强更Pro
Top