SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件

2023-07-06 11:20:59 来源: 博客园

之前我们已经,出了一些列文章。 讲解如何封统一全局响应Restful API。

感兴趣的可以看我前面几篇文章 (整个starter项目发展史)

SpringBoot定义优雅全局统一Restful API 响应框架


【资料图】

SpringBoot定义优雅全局统一Restful API 响应框架二

SpringBoot定义优雅全局统一Restful API 响应框架三

SpringBoot定义优雅全局统一Restful API 响应框架四

SpringBoot定义优雅全局统一Restful API 响应框架五

SpringBoot定义优雅全局统一Restful API 响应框架六

后续我萌生里新的想法,SpringBoot 不是提供了自己的starter。我们也可以自定义starter吗,于是我定义了rest-api-spring-boot-starter,已经发布到maven中央仓库,对之前Restful API 响应框架 做了集成和重构,

在这个基础上我又总结封装了我自己工作以常用的很多工具,结合SpringBoot 封装了全能的工具。 已经更新到了1.3.0 不耦合任何依赖 请使用最新版本

目前更新版本1.3.0 功能如下

支持一键配置自定义RestFull API 统一格式返回支持RestFull API 错误国际化支持全局异常处理,全局参数验证处理业务错误断言工具封装,遵循错误优先返回原则redis工作封装。支持所有key操作工具RestTemplate 封装 POST,GET 请求工具日志集成。自定义日志路径,按照日志等级分类,支持压缩和文件大小分割。按时间显示工具库集成 集成了lombok,hutool,commons-lang3,guava。不需要自己单个引入集成mybatisPlus一键代码生成

github 地址

下面我讲一下怎么在项目中去使用

我们新建一个SpringBoot Web项目

我们只需要在pom中引入即可

            cn.soboys            rest-api-spring-boot-starter            1.2.0        

在启动类或者配置类中加上@EnableRestFullApi注解即可

RestFull API使用

这样在项目controller中我们写普通的请求如:

@PostMapping("/chat")    public HashMap chatDialogue() {        HashMap m = new HashMap();        m.put("age", 26);        m.put("name", "Judy");        return m;    }

返回的就是全局统一RestFull API

我们也可以这么写

提供了很多返回方法。

当然如果你这个接口不想包装成全局返回,想自定义单独返回 如我们只需要在方法上加上@NoRestFulApi注解即可

@PostMapping("/chat")    @NoRestFulApi    public HashMap chatDialogue() {        HashMap m = new HashMap();        m.put("age", 26);        m.put("name", "Judy");        return m;    }

就不会对返回内容进行任何包装处理。

全局错误拦截,参数校验

帮你封装好了所有http常见错误,和所有请求类型和参数错误。

如请求错误

{    "success": false,    "code": "405",    "msg": "方法不被允许",    "timestamp": "2023-07-03 22:36:47",    "data": "Request method "GET" not supported"}

请求资源不存在

{    "success": false,    "code": "404",    "msg": "请求资源不存在",    "timestamp": "2023-07-03 22:42:35",    "data": "/api"}

参数校验错误

验证Studen对象参数

/** * @author 公众号 程序员三时 * @version 1.0 * @date 2023/6/26 22:10 * @webSite https://github.com/coder-amiao */@Datapublic class Student {    @NotBlank    private String nam;    @NotBlank    private String hobby;}
@PostMapping("/chat")    public HashMap chatDialogue(@Validated  Student student) {        HashMap m = new HashMap();        m.put("age", 26);        m.put("name", "Judy");        return m;    }

请求结果

JSON Body参数

@PostMapping("/chat")    public HashMap chatDialogue(@RequestBody @Validated  Student student) {        HashMap m = new HashMap();        m.put("age", 26);        m.put("name", "Judy");        return m;    }
错误国际化

内置封装错误默认支持英文和中文两种国际化。你不做任何配置自动支持

如果需要内置支持更多语言,覆盖即可。

自定义自己错误国际化和语言

i18n:    # 若前端无header传参则返回中文信息    i18n-header: Lang    default-lang: cn    message:      # admin      internal_server_error:        en: Internal Server Error        cn: 系统错误      not_found:        en: Not Found        cn: 请求资源不存在

message 对应错误提示对应internal_server_error 自定义下面语言自己定义 和前端传入i18n-header 对应上,就显你定义错误语言

我不传错误国际化默认就是中文在 default-lang: cn进行配置

当我传入 指定语言 就会按照你配置的国际化自定义返回错误提示

自定义错误响应

如果我内置错误无法满足你业务需求,你也可以自定义自己错误码

你自定义错误枚举 只需要实现ResultCode接口即可

package cn.soboys.restapispringbootstarter;import cn.soboys.restapispringbootstarter.i18n.I18NKey;/** * @author 公众号 程序员三时 * @version 1.0 * @date 2023/6/26 10:21 * @webSite https://github.com/coder-amiao * 响应码接口,自定义响应码,实现此接口 */public interface ResultCode extends I18NKey {    String getCode();    String getMessage();}

如果要支持国际化还需要实现国际化接口I18NKey参考我内部HttpStatus实现即可

package cn.soboys.restapispringbootstarter;import cn.soboys.restapispringbootstarter.i18n.I18NKey;/** * @author 公众号 程序员三时 * @version 1.0 * @date 2023/6/26 11:01 * @webSite https://github.com/coder-amiao */public enum HttpStatus implements ResultCode, I18NKey {    /**     * 系统内部错误     */    INTERNAL_SERVER_ERROR("500", "internal_server_error"),    BAD_GATEWAY("502", "bad_gateway"),    NOT_FOUND("404", "not_found"),    UNAUTHORIZED("401", "unauthorized"),    FORBIDDEN("403", "forbidden"),    METHOD_NOT_ALLOWED("405", "method_not_allowed"),    REQUEST_TIMEOUT("408", "request_timeout"),    INVALID_ARGUMENT("10000", "invalid_argument"),    ARGUMENT_ANALYZE("10001", "argument_analyze"),    BUSINESS_EXCEPTION("20000", "business_exception");    private final String value;    private final String message;    HttpStatus(String value, String message) {        this.value = value;        this.message = message;    }    @Override    public String getCode() {        return value;    }    @Override    public String getMessage() {        return message;    }    @Override    public String key() {        return message;    }}
rest-api:  enabled: false  i18n:    # 若前端无header传参则返回中文信息    i18n-header: Lang    default-lang: cn    message:      # admin      internal_server_error:        en: Internal Server Error        cn: 系统错误      bad_gateway:        en: Bad Gateway        cn: 错误的请求      unauthorized:        en: Unauthorized        cn: 未授权      forbidden:        en: Forbidden        cn: 资源禁止访问      method_not_allowed:        en: Method Not Allowed        cn: 方法不被允许      request_timeout:        en: Request Timeout        cn: 请求超时      invalid_argument:        en: Invalid Argument {}        cn: 参数错误 {}      argument_analyze:        en: Argument Analyze {}        cn: 参数解析异常 {}      business_exception:        en: Business Exception        cn: 业务错误      not_found:        en: Not Found        cn: 请求资源不存在

内部错误不需要做任何配置,自动支持国际化。如果需要支持更多语言,可以自定义进行覆盖。

业务异常断言

在项目开发中我们有时需要封装自己异常类,信息我封装了统一的错误异常类。BusinessException对业务异常类做了全局错误拦截,

封装·了统一业务异常断言工具,遵循错误优先返回原则。代码更优雅

@GetMapping("/exception")    public Result exception(){        Student s=null;        Assert.isFalse(s==null,"学生不能为空");        return Result.buildSuccess();    }

抛出统一业务异常

当然如果你要定义自己的异常类。可以定义自己异常类·继承我的BusinessException

Redis 工具库使用

进一步封装的对Redis所以相关key,value操作,在使用redis工具库时候。我们需要引入

            org.springframework.boot            spring-boot-starter-data-redis        

默认不会帮你引入。

然后在使用时候注入就行

@Autowired    private RedisTempUtil redisTempUtil;
@GetMapping("/redis")    public Result redis() {        redisTempUtil.set("test", "123456");        return Result.buildSuccess();    }    @GetMapping("/redis/get")    public Result redisGet() {        String value = redisTempUtil.get("test").toString();        log.info("redis值{}", value);        return Result.buildSuccess();    }
RestTemplate 请求工具

进一步封装了RestTemplate请求 Post和GET项目中使用时注入

@Autowired    private RestFulTemp restFulTemp;
@GetMapping("/doGet")    public Result doGet() {        ResponseEntity response = restFulTemp.doGet("http://127.0.0.1:8000/redis/get");        return Result.buildSuccess(response.getBody());    }
日志使用

进一步封装了 日志处理达到开箱即用。在属性文件中配置相关日志配置即可

rest-api:  enabled: false  logging:    path: ./logs   #日志存储路径(服务器上绝对)    max-history: 90 # 保存多少天    max-file-size: 3MB  # 每个文件大小    max-total-size-cap: 1GB  #总文件大小超过多少压缩    level-root: INFO    # 这里的INFO可以替换为其他日志等级,如DEBUG, WARN, ERROR, TRACE, FATAL, OFF等。 日志等级由低到高分别是debugger-info-warn-error

如果你的属性文件不做任何日志配置,默认日志就是上面这样配置。

集成mybatisPlus一键代码生成

在项目中我们会频繁使用到mybatisPlus 但是简单的模板代码我们一键生成就好。 默认不依赖mybatisPlus任何相关包。如果需要使用自动代码生成引入mybatisPlus 代码生成依赖包即可。

                    com.baomidou            mybatis-plus-generator            3.4.1            true                                    mysql            mysql-connector-java            8.0.28            true                                    org.freemarker            freemarker            2.3.31            true        

你可以直接写测试类,然后直接去调用代码生成即可

public class Test {    public static void main(String[] args) {        GenerateCodeConfig config=new GenerateCodeConfig();        config.setDriverName("com.mysql.cj.jdbc.Driver");        config.setUsername("root");        config.setPassword("root");        config.setUrl("jdbc:mysql://127.0.0.1:3306/ry?useUnicode=true&useSSL=false&characterEncoding=utf8");        //生成代码保存路径,不设置就是当前项目下路径,如何设置请使用绝对路径        config.setProjectPath("superaide");        config.setPackages("cn.soboys.superaide");        MyBatisPlusGenerator.generate(config);    }}

效果如下

关注公众号,程序员三时持续输出优质内容 希望给你带来一点启发和帮助

下篇文章就这个源码剖析讲解 如何封装自己的stater

标签:

SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件

之前我们已经,出了一些列文章。讲解如何封统一全局响应RestfulAPI。感

07-06 11:20:59

各级各类学校达51.85万所(新数据 新看点)学历教育在校生2.93亿人,专任教师超1880万人 最新资讯

人民日报北京7月5日电(记者丁雅诵)教育部7月5日发布2022年全国教育事

07-06 11:34:41

消息称苹果推迟至2025年发布iPhone SE 4

DoNews7月6日消息,根据UBIResearch发布的最新报告显示,苹果已将iPhon

07-06 11:25:56

世界球精选!福建福州:不出小区可办税缴费

这是福建省首个设在小区里的城乡居民财税便民代办点“税银人家”外景(

07-06 11:26:01

面板股异动拉升 深华发A、彩虹股份涨停_每日速读

上证报中国证券网讯7月6日上午交易时段,面板股异动拉升。9时57分,深

07-06 11:02:32

7月6日华东地区乙醇市场行情涨后暂稳

山东地区乙醇市场玉米乙醇6500-6550元 吨,无水7400-7500元 吨。安徽地

07-06 10:57:39

天天新资讯:济南童康儿童医院:什么原因会导致患上遗尿症?

遗尿症是指孩子成长到5岁以后,睡眠中仍不能自控而将尿液排泄在床上的

07-06 10:38:26

天润工业受益重卡复苏预盈超1.9亿 多元布局重型发动机曲轴市占率达60%

重卡市场复苏,天润工业(002283 SZ)经营随之向好。7月4日晚间,天润

07-06 10:50:33

渝昆高铁川渝段四川境内箱梁架设完成 天天快资讯

渝昆高铁川渝段四川境内箱梁架设完成- "渝昆高铁川渝段全线共有3006孔

07-06 10:19:01

今日热讯:加油站“搞副业”渐成主流 加德士中能链助力行业转型

加油站“搞副业”已成主流?从2019年“两桶油”开卖咖啡,到2021年中石

07-06 10:18:19

4.32亿美元买盘提振昙花一现?中欧数据接连释放不祥之兆 黄金上演“高台跳水”|天天实时

24K99讯周三7月5日公布的数据显示中国和欧元区数据疲弱表明世界经济增

07-06 08:17:06

世界今日报丨喜提新车却俩月无法上牌!北京这家奥迪4S店员工挪用购车款,车主难维权

北京的新车交易价格可以说是比较低的,这跟北京的摇号政策有很大关系。

07-06 08:12:52

未来战士破解版下载(未来战士3无敌版)

1、要级别的吧~查看更多答案。本文就为大家分享到这里,希望看了会喜欢

07-06 07:41:48

甬金股份:融资净买入80.31万元,融资余额6060.61万元(07-05)

2023年7月5日甬金股份融资净买入80 31万元,融资余额6060 61万元

07-06 07:24:15

开一家紫亭风女装折扣店收益有多少? 一年能挣多少钱?

女装销量不断很大,因而有诸多投资者想参与。紫亭风女装,款式多,设计

07-06 06:49:47

微观经济/美国“衰退指标”为何不准了?\国泰君安国际首席经济学家 周 浩

经济观察家频道

07-06 06:32:19

环球热文:摩根大通美国国债客户净多头回落

摩根大通美国国债客户调查结果显示,最近一周,多头占比下降5个百分点

07-06 05:45:16

果然视频|歌手李玟轻生去世,年仅48岁_热点聚焦

00:08(记者路董萌)歌手李玟姐姐李思林Nancy7月5日晚发布微博,CoCo于

07-06 05:11:35

世界微速讯:小米万能盒子

1 在首页左上角,点击添加设备的按钮。2 在设备列表中,点击小米电视盒

07-06 04:07:16

马佐拉:米兰卖托纳利是为了钱,这是错的,他们本该留住核心球员 全球新动态

马佐拉:米兰卖托纳利是为了钱,这是错的,他们本该留住核心球员,巴雷

07-06 01:06:19

朝阳区孙河地区黄港村青年志愿者服务队(对于朝阳区孙河地区黄港村青年志愿者服务队简单介绍)-天天时讯

聊聊一篇阳区孙河地区黄港村青年志愿者服务队,对于朝阳区孙河地区黄港

07-06 00:38:31

报道:在平均海拔逾3000米的川西高原,组建一支女足队伍有多难?

新华社北京7月5日电题:在平均海拔逾3000米的川西高原,组建一支女足队

07-05 22:45:25

快讯:对爱人留言的甜蜜句子

对爱人留言的甜蜜句子1、一个伸手不见五指的黑夜里,一个粗壮的男人残

07-05 21:55:38

意媒:若无法从拉齐奥签米林科维奇,尤文有意亚特兰大库普梅纳斯

直播吧7月5日讯意大利媒体《LaStampa》的消息,尤文希望能够签下拉齐奥

07-05 21:23:12

消息!腾讯投资《极限竞速:地平线》创始人新工作室Lighthouse Games

今年3月,《极限竞速:地平线》系列开发商PlaygroundGames联合创始人Ga

07-05 20:57:00

卫冕冠军险些爆冷一轮游,只因费德勒?莱巴金娜:他来看球我很紧张!

在温网首击过关的莱巴金娜,承认可能因为获邀任嘉宾的费德勒坐在包厢观

07-05 20:41:26

深圳IMAGE|深圳报业食堂摆摊,火了!

火爆深圳的“摆摊经济”里,冲出了一个“顶流”!视频加载中 近日,

07-05 19:50:50

【热闻】7月20日,“弦动上海”国际吉他艺术节重磅回归

VideoPlayerisloading

07-05 19:20:48

非洲火车司机来中国培训 他们需要学习哪些课程?_天天微资讯

中新网郑州7月5日电(记者 韩章云)7月5日,亚吉铁路2023年电力机车

07-05 18:44:23

黑龙江新冠A类药品临时纳入医保支付范围

黑龙江省关于将医保目录外新冠治疗A类药品临时纳入我省基本医疗保险支

07-05 18:32:17

环球微头条丨博世科:目前搭载线控底盘的小型智能化环卫装备正在研发中

博世科7月5日在互动平台回答投资者提问时表示,博世科的研发团队具备线

07-05 17:36:59

世界要闻:东阳光:控股子公司取得采矿许可证

【东阳光:控股子公司取得采矿许可证】财联社7月5日电,东阳光公告,控

07-05 17:15:16

图知道|你印象最深的毕业礼物是什么_每日看点

毕业季来临,各高校都在毕业礼物上用足了巧思:有的学校赠送给学生一张

07-05 16:37:25

JT所有者Kartell收购竞争对手MXGroup|速讯

JT的所有者、供暖和浴室供应商Kartell已收购英国淋浴盘制造商MXGroup,

07-05 16:03:09

今日热搜:荣耀官方宣布MagicPad平板搭载IMAX Enhanced护眼屏,画质惊艳

【ITBEAR科技资讯】7月5日消息,荣耀官方今日宣布了其最新平板产品Magi

07-05 15:37:02

今头条!菲律宾台风海燕(关于菲律宾台风海燕的基本详情介绍)

1、台风海燕(英语:TropicalStormHaiyan,‎国际编号:0716,联合台风

07-05 14:57:00

莫伦特斯:我希望在皇马能见到姆巴佩,但如果他不来会有更好的人

直播吧7月5日讯近日,皇马名宿莫伦特斯在他担任大使的FCFUTURES项目介

07-05 14:48:04

2023年7月5日正辛醇价格最新行情预测_世界今日讯

中国报告大厅2023年7月5日正辛醇价格最新走势监测显示:聊城金瑞辐射防

07-05 14:11:35

医疗事故手指截肢赔多少钱?_当前热议

1 疗事故医疗事故是指医疗机构在提供医疗服务的过程中发生的对患者造成

07-05 13:48:06

环球速看:国家发改委副主任丛亮:推动数字经济基础设施互联互通

在“2023全球数字经济大会”开幕式上,国家发改委副主任丛亮表示,近年

07-05 13:24:39

焦点快播:杭州亚组委:全程智能筹办亚运 推出亚运史上首个数字火炬手

据中国网,国新办今日(6月14日)就杭州亚运会亚残运会筹办情况举行发

07-05 13:05:47

湖州吴兴3宗商住地24.17亿元成交 滨江摘得2宗 环球热资讯

观点网讯:7月5日,浙江湖州吴兴区出让3宗商住地,总起价24 17亿元。其

07-05 12:27:40

每日视讯:国家药监局:罕见病新药审批速度最快,还将继续加速

“目前,在所有药品上市申请中,罕见病新药的审评审批时限是最短的。”

07-05 12:05:33

中国太保寿险总经理蔡强:寿险产品利率切换后 分红险能够成为公司未来的创新主打产品

7月4日,中国太保2023年度资本市场开放日在太保家园杭州国际颐养社区举

07-05 11:56:31

环球信息:苹果iphone12最低价(苹果iphone12最新消息)

来为大家解答以上问题,苹果iphone12最低价,苹果iphone12最新消息很多

07-05 11:15:34

税收新举措激发消费新潜能 世界快报

近日,财政部、税务总局、工业和信息化部发布公告,明确了2024年至2027

07-05 11:00:26

环旭电子:7月4日融资净买入2886.21万元,连续3日累计净买入8644.74万元-热点评

7月4日,环旭电子(601231)融资买入8044 07万元,融资偿还5157 86万元

07-05 10:15:59

男生恶意篡改同学高考志愿被行拘 拍下准考证号多次试密码

7月2日,湖北荆州,王同学报警称自己的高考志愿被篡改,民警查询IP后发

07-05 10:03:16

句容市2023年养老金上涨多少钱一个月 江苏句容市养老金调整预估最新消息(全文)

近期,关于养老金调整方案的消息引起了广大企退人员的关注和期待。今年

07-05 09:47:48

博创科技7月5日快速反弹 今日热议

以下是博创科技在北京时间7月5日09:51分盘口异动快照:7月5日,博创科

07-05 09:46:08

各级各类学校达51.85万所(新数据 新看点)学历教育在校生2.93亿人,专任教师超1880万人 最新资讯
消息称苹果推迟至2025年发布iPhone SE 4
世界球精选!福建福州:不出小区可办税缴费
面板股异动拉升 深华发A、彩虹股份涨停_每日速读
7月6日华东地区乙醇市场行情涨后暂稳
天天新资讯:济南童康儿童医院:什么原因会导致患上遗尿症?
天润工业受益重卡复苏预盈超1.9亿 多元布局重型发动机曲轴市占率达60%
渝昆高铁川渝段四川境内箱梁架设完成 天天快资讯
今日热讯:加油站“搞副业”渐成主流 加德士中能链助力行业转型
4.32亿美元买盘提振昙花一现?中欧数据接连释放不祥之兆 黄金上演“高台跳水”|天天实时
世界今日报丨喜提新车却俩月无法上牌!北京这家奥迪4S店员工挪用购车款,车主难维权
未来战士破解版下载(未来战士3无敌版)
甬金股份:融资净买入80.31万元,融资余额6060.61万元(07-05)
开一家紫亭风女装折扣店收益有多少? 一年能挣多少钱?
微观经济/美国“衰退指标”为何不准了?\国泰君安国际首席经济学家 周 浩
环球热文:摩根大通美国国债客户净多头回落
果然视频|歌手李玟轻生去世,年仅48岁_热点聚焦
世界微速讯:小米万能盒子
马佐拉:米兰卖托纳利是为了钱,这是错的,他们本该留住核心球员 全球新动态
朝阳区孙河地区黄港村青年志愿者服务队(对于朝阳区孙河地区黄港村青年志愿者服务队简单介绍)-天天时讯
报道:在平均海拔逾3000米的川西高原,组建一支女足队伍有多难?
快讯:对爱人留言的甜蜜句子
意媒:若无法从拉齐奥签米林科维奇,尤文有意亚特兰大库普梅纳斯
消息!腾讯投资《极限竞速:地平线》创始人新工作室Lighthouse Games
卫冕冠军险些爆冷一轮游,只因费德勒?莱巴金娜:他来看球我很紧张!
深圳IMAGE|深圳报业食堂摆摊,火了!
【热闻】7月20日,“弦动上海”国际吉他艺术节重磅回归
非洲火车司机来中国培训 他们需要学习哪些课程?_天天微资讯
黑龙江新冠A类药品临时纳入医保支付范围
环球微头条丨博世科:目前搭载线控底盘的小型智能化环卫装备正在研发中
世界要闻:东阳光:控股子公司取得采矿许可证
图知道|你印象最深的毕业礼物是什么_每日看点
JT所有者Kartell收购竞争对手MXGroup|速讯
今日热搜:荣耀官方宣布MagicPad平板搭载IMAX Enhanced护眼屏,画质惊艳
今头条!菲律宾台风海燕(关于菲律宾台风海燕的基本详情介绍)
莫伦特斯:我希望在皇马能见到姆巴佩,但如果他不来会有更好的人
2023年7月5日正辛醇价格最新行情预测_世界今日讯
医疗事故手指截肢赔多少钱?_当前热议
环球速看:国家发改委副主任丛亮:推动数字经济基础设施互联互通
焦点快播:杭州亚组委:全程智能筹办亚运 推出亚运史上首个数字火炬手
湖州吴兴3宗商住地24.17亿元成交 滨江摘得2宗 环球热资讯
每日视讯:国家药监局:罕见病新药审批速度最快,还将继续加速
中国太保寿险总经理蔡强:寿险产品利率切换后 分红险能够成为公司未来的创新主打产品
环球信息:苹果iphone12最低价(苹果iphone12最新消息)
税收新举措激发消费新潜能 世界快报
环旭电子:7月4日融资净买入2886.21万元,连续3日累计净买入8644.74万元-热点评
男生恶意篡改同学高考志愿被行拘 拍下准考证号多次试密码
句容市2023年养老金上涨多少钱一个月 江苏句容市养老金调整预估最新消息(全文)
博创科技7月5日快速反弹 今日热议
新入职员工拒签劳动合同怎么办? 每日速递
X 广告
行业动态
X 广告

Copyright ©  2015-2022 西南植物网版权所有  备案号:皖ICP备2022009963号-8   联系邮箱:39 60 29 14 2@qq.com