目前我使用最多的JavaWeb框架就是 __SpringBoot__。在使用这套框架的过程中,或者说,在CURD
的过程中,有一些很繁复的事务需要去搞定,浪费了很多时间,这里就简单记录一下,以后有时间再写个组件来解决这些麻烦。
批量的CURD
接口
几乎所有的管理后台都会涉及到大部分数据的CURD
,它们几乎是相似的:通过关联的查询条件get
,通过本身数据put
与post
,通过id或id数组delete
。
从我的经验来看,一般情况下,Controller
都会提供以下五个接口:
- 通过
ID
获取详情 - 通过查询条件获取列表
- 添加新的数据
- 通过
ID
进行数据修改 - 通过
ID
数组进行批量删除
而这五个接口是可以通过设计来进行拓展使用的,也就是说可以通过合理的设计来自动构建这五个基本接口,并且适应不同的数据体。
接口文档
一般情况下我会用Springfox
或是Openapi
来作为接口文档的生成工具,看起来似乎很方便,但这就需要对新增、修改、查询分别做对象处理。如果复用同一个对象的话,新增与修改的接口文档就会出现很多不需要传递的属性值,这是不对的。
如果使用底层对象,通过继承的方式拓展出新增、修改与查询的数据体,这又导致了CURD
通用框架的设计困难。但理论上来说,这样的方式才符合面向对象的设计模式。
环境分离
这一点其实并不算问题,SpringBoot
提供了非常多的分离特性可以利用。写在这里只是为了提醒自己要去写一个便利组件。
常用的注解包括了:
Profile
- 按照配置文件标签进行区别注入。ConditionalOnMissingBean
- 实现默认注入,方便拓展开发。ConditionalOnProperty
- 通过配置文件中的属性来控制对象注入,在做环境分离的时候非常好用。
这三个注解是我常用的,方便建立测试环境、本地模拟环境和生产环境。切换环境只需要加载不同的配置文件,不需要在代码上改来改去。
另外一点就是环境分离需要避免通过if
来隔离不同环境的逻辑,这样写拓展性不高,并且影响代码整洁性与性能。最好是通过注入不同的逻辑对象来分别控制。
参数校验
SpringBoot
提供了spring-boot-starter-validation
用于做参数校验,通过@Valid
来标注需要被校验的接口参数与嵌套对象。这种方式没有问题,并且通过拦截MethodArgumentNotValidException
异常并截取错误信息的方式是可以动态生成错误信息反馈给前端的。
我这里要说的问题是参数校验与接口文档的组合,目前来说,我还没找到一个更好的方式使得这两者结合,导致现在的一些对象属性会添加数个注解,例如:
1 |
|
其中,@NotNull
与@Schema
中的required=true
是表示的同一个意思,都表示了此字段不为空。所以较为合理的方式是将Validate
校验与Schema
合并,统一参数。
文件上传与访问
我经常会遇到需要上传文件的需求,某些情况下可以把文件进行转码保存在数据库,便于关联管理。但一般情况下都需要将这些文保存在特定目录下,并提供外网访问地址。
实现的方式有很多,我了解的比较主流的方式有两种:
- 集成的文件管理系统,优点是简单快速,方便控制文件权限,缺点是不易拓展。
- 外部文件系统,例如图床系统,优点是拓展性与复用性很高,缺点就是难以控制文件权限。
但实际上,外部文件系统只要能解决与目标系统的权限关联,它就能解决大部分的问题。
可恶的bug
消失的页面
问题描述:
当前端页面在 SpringBoot 中以静态文件的方式存在并提供访问(将前端文件集成在后端代码中)时,需要替换成新的前端页面文件。
当 SpringBoot 正在运行时 删除 前端文件 再添加 新的前端文件时,新加的前端文件不会刷新在 Tomcat 服务中(页面404)。
解决方法: __重启Idea__。