- 前言
今天开始搭建我们的kono Spring Boot脚手架,首先会集成Spring MVC并进行定制化以满足日常开发的需要,我们先做一些刚性的需求定制,后续再补充细节。如果你看了本文有什么问题可以留言讨论。多多持续关注,共同学习,共同进步。
Gitee: gitee.com/felord/kono
GitHub: github.com/NotFound403…
- 统一返回体
在开发中统一返回数据非常重要。方便前端统一处理。通常设计为以下结构:
1 | json复制代码{ |
- code 业务状态码,设计时应该区别于http状态码。
- data 数据载体,用以装载返回给前端展现的数据。
- msg 提示信息,用于前端调用后返回的提示信息,例如 “新增成功”、“删除失败”。
- identifier 预留的标识位,作为一些业务的处理标识。
根据上面的一些定义,声明了一个统一返回体对象RestBody<T>
并声明了一些静态方法来方便定义。
1 | java复制代码package cn.felord.kono.advice; |
但是每次都要显式声明返回体也不是很优雅的办法,所以我们希望无感知的来实现这个功能。Spring Framework正好提供此功能,我们借助于@RestControllerAdvice
和ResponseBodyAdvice<T>
来对项目的每一个@RestController
标记的控制类的响应体进行后置切面通知处理。
1 | java复制代码/** |
当我们接口返回一个实体类时会自动封装到统一返回体RestBody<T>
中。
既然有
ResponseBodyAdvice
,就有一个RequestBodyAdvice
,它似乎是来进行前置处理的,以后可能有一些用途。
- 统一异常处理
统一异常也是@RestControllerAdvice
能实现的,可参考之前的Hibernate Validator校验参数全攻略。这里初步集成了校验异常的处理,后续会添加其他异常。
1 | java复制代码/** |
- 简化类型转换
简化Java Bean之间转换也是一个必要的功能。 这里选择mapStruct,类型安全而且容易使用,比那些BeanUtil
要好用的多。但是从我使用的经验上来看,不要使用mapStruct提供的复杂功能只做简单映射。详细可参考文章Spring Boot 2 实战:集成 MapStruct 类型转换。
集成进来非常简单,由于它只在编译期生效所以引用时的scope
最好设置为compile
,我们在kono-dependencies中加入其依赖管理:
1 | xml复制代码<dependency> |
在kono-app
中直接引用上面两个依赖,但是这样还不行,和lombok一起使用编译容易出现SPI错误。我们还需要集成相关的Maven插件到kono-app编译的生命周期中去。参考如下:
1 | xml复制代码<plugin> |
然后我们就很容易将一个Java Bean转化为另一个Java Bean。下面这段代码将UserInfo
转换为UserInfoVO
而且自动为UserInfoVO.addTime
赋值为当前时间,同时这个工具也自动注入了Spring IoC,而这一切都发生在编译期。
编译前:
1 | java复制代码/** |
编译后:
1 | java复制代码package cn.felord.kono.beanmapping; |
其实mapStruct也就是帮我们写了Getter和Setter,但是不要使用其比较复杂的转换,会增加学习成本和可维护的难度。
- 单元测试
将以上功能集成进去后分别做一个单元测试,全部通过。
1 | java复制代码 @Autowired |
- 总结
自制脚手架初步具有了统一返回体、统一异常处理、快速类型转换,其实参数校验也已经支持了。后续就该整合数据库了,常用的数据库访问技术主要为Mybatis、Spring Data JPA、JOOQ等,不知道你更喜欢哪一款?欢迎留言讨论。
关注公众号:Felordcn获取更多资讯
本文转载自: 掘金