目前我使用最多的JavaWeb框架就是 __SpringBoot__。在使用这套框架的过程中,或者说,在CURD的过程中,有一些很繁复的事务需要去搞定,浪费了很多时间,这里就简单记录一下,以后有时间再写个组件来解决这些麻烦。

批量的CURD接口

几乎所有的管理后台都会涉及到大部分数据的CURD,它们几乎是相似的:通过关联的查询条件get,通过本身数据putpost,通过id或id数组delete

从我的经验来看,一般情况下,Controller都会提供以下五个接口:

  • 通过ID获取详情
  • 通过查询条件获取列表
  • 添加新的数据
  • 通过ID进行数据修改
  • 通过ID数组进行批量删除

而这五个接口是可以通过设计来进行拓展使用的,也就是说可以通过合理的设计来自动构建这五个基本接口,并且适应不同的数据体。

接口文档

一般情况下我会用Springfox或是Openapi来作为接口文档的生成工具,看起来似乎很方便,但这就需要对新增、修改、查询分别做对象处理。如果复用同一个对象的话,新增与修改的接口文档就会出现很多不需要传递的属性值,这是不对的。

如果使用底层对象,通过继承的方式拓展出新增、修改与查询的数据体,这又导致了CURD通用框架的设计困难。但理论上来说,这样的方式才符合面向对象的设计模式。

环境分离

这一点其实并不算问题,SpringBoot提供了非常多的分离特性可以利用。写在这里只是为了提醒自己要去写一个便利组件。

常用的注解包括了:

  • Profile - 按照配置文件标签进行区别注入。
  • ConditionalOnMissingBean - 实现默认注入,方便拓展开发。
  • ConditionalOnProperty - 通过配置文件中的属性来控制对象注入,在做环境分离的时候非常好用。

这三个注解是我常用的,方便建立测试环境、本地模拟环境和生产环境。切换环境只需要加载不同的配置文件,不需要在代码上改来改去。

另外一点就是环境分离需要避免通过if来隔离不同环境的逻辑,这样写拓展性不高,并且影响代码整洁性与性能。最好是通过注入不同的逻辑对象来分别控制。

参数校验

SpringBoot提供了spring-boot-starter-validation用于做参数校验,通过@Valid来标注需要被校验的接口参数与嵌套对象。这种方式没有问题,并且通过拦截MethodArgumentNotValidException异常并截取错误信息的方式是可以动态生成错误信息反馈给前端的。

我这里要说的问题是参数校验与接口文档的组合,目前来说,我还没找到一个更好的方式使得这两者结合,导致现在的一些对象属性会添加数个注解,例如:

1
2
3
4
@NotNull
@TableField("name")
@Schema(name = "姓名", required = true)
private String name;

其中,@NotNull@Schema中的required=true是表示的同一个意思,都表示了此字段不为空。所以较为合理的方式是将Validate校验与Schema合并,统一参数。

文件上传与访问

我经常会遇到需要上传文件的需求,某些情况下可以把文件进行转码保存在数据库,便于关联管理。但一般情况下都需要将这些文保存在特定目录下,并提供外网访问地址。

实现的方式有很多,我了解的比较主流的方式有两种:

  • 集成的文件管理系统,优点是简单快速,方便控制文件权限,缺点是不易拓展。
  • 外部文件系统,例如图床系统,优点是拓展性与复用性很高,缺点就是难以控制文件权限。

但实际上,外部文件系统只要能解决与目标系统的权限关联,它就能解决大部分的问题。

可恶的bug

消失的页面

问题描述:

当前端页面在 SpringBoot 中以静态文件的方式存在并提供访问(将前端文件集成在后端代码中)时,需要替换成新的前端页面文件。
SpringBoot 正在运行时 删除 前端文件 再添加 新的前端文件时,新加的前端文件不会刷新在 Tomcat 服务中(页面404)。

解决方法: __重启Idea__。


本站总访问量