# 基础基类
- BaseEntity
- 定义所有领域的基类
设置所有类的主键为id,类型为Long,通过雪花算法生成主键,子类可以通过valueOf()生成主键。
雪花算法Long类型主键
- 算法足够简单,除服务器时间需要一致外无其他依赖,1毫秒支持4096个序列,支持1024台机器,支持82年
- 生成数据非连续递增,适合MySql存储引擎
- 全局唯一,适合分表,数据运维等*Twitter-Snowflake,64位自增ID算法详解 - 简书 (jianshu.com)
* 支持尾数奇偶分散分布,参考<shardingsphere-jdbc>中关于分布式自增主键策略的说明
* 同时提供每日序列号生成器,可以用在每天生成不重复序号的场景,每日序号生成器 [infrastructure-core/src/main/java/plus/cove/infrastructure/generator/DailyNumberGenerator.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)]
BaseTimeEntity
- 带创建时间和更新时间,valueOf()同时对id和时间进行赋值。
- BaseEnum
- 定义所有枚举的基类,用于枚举与数字转换(数据库保存),枚举到描述转换(导出Excel)
- 需要多个描述,可以进行扩展
- ActionResult
[infrastructure-core/src/main/java/plus/cove/infrastructure/component/ActionResult.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)]
接口统一返回结构,格式:code=0表示成功,其他失败
{code: 0, message: '错误信息', data: [Object|Array]}
一般情况下业务层直接抛出异常即可,通过webapi层的@ControllerAdvice+@ExceptionHandler [flower-webapi/src/main/java/plus/cove/flower/webapi/config/WebResponseException.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)],截获异常,并返回此格式 。
具体异常可以参阅下节<BusienssException>
- BusinessException
[infrastructure-core/src/main/java/plus/cove/infrastructure/exception/BusinessException.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)]
业务异常,包括异常编码和异常信息,业务逻辑使用此异常即可。
通过BusinessError来定义具体业务的具体错误,项目定义了部分公共错误,包括NetworkError, ServiceError, SystemError, ValidatorError。
业务逻辑可以通过throw BusinessException.from(error)或者直接使用校验工具类AssertHelper来抛出异常。 [infrastructure-core/src/main/java/plus/cove/infrastructure/helper/AssertHelper.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)]
比如创建账号的时,通过名称查询账号account已存在,则可以通过AssertHelper.assertNull(account, AccountError.EXISTED_ACCOUNT)直接抛出异常。
- BaseConverter
[infrastructure-core/src/main/java/plus/cove/infrastructure/converter/BaseConverter.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)]
统一转换,对entity和dto进行转换,对对象和集合进行转换。
DefaultConverter
- 默认实现,采用orika进行实现(之前用的是mapstruct),默认实现只支持同名称转换,对于复杂转换,可以通过继承DefaultConter,实现自定义转换。
# Spring相关配置
所有的配置以Unite为开始,property以summer.开始。
- cache相关
- UniteCacheConfig <summer.cache-config>
对缓存进行配置,包括默认过期时间,最大过期时间,空值保留时间
- 最大过期时间:如果缓存的过期时间设置为无限大,则缓存修改名称或者更换库时,会存在无效缓存的风险或带来运维的压力,最大过期时间是针对此种情况,对超过最大过期时间的缓存进行重置,只针对redis;
- 默认过期时间:如果没有设置缓存时间,则使用此设置;
- 空值过期时间:如果缓存为空,则保持此设置时间,防止缓存击穿,需要结合CacheUtils使用;
- 支持@Cacheable方式使用,可以使用CacheUtils进行手动缓存操作,该工具同时支持缓存空值,防止缓存击穿。
架构使用SpringBoot-Cache
- 使用缓存方式一致,支持多种缓存方式,通过在application.properties中配置spring.cache.type=SIMPLE|REDIS,无需改动代码即可实现缓存方式切换,可以方便开发与测试环境切换或调试。
- Cacheable支持设置缓存过期时间(SpringBoot为了支持不同缓存方案 ,不支持设置缓存过期时间),通过在key后加#秒数,可以设置缓存过期时间,比如:@Cacheable(cacheNames = "CACHE_NAME", key = "CACHE_KEY#10"),即设置缓存时间为10秒,CacheUtils同样支持。具体见UniteCacheConfig.resetCache(String name)
- http相关
UniteHttpConfig <summer.http-config>
对连接超时,读取超时,跨域等进行设置
- corsMaxAge 跨域预校验有效期
- corsAllowedOrigin 跨域允许的源地址
- corsAllowedHeaders 跨域允许的头
- corsAllowedMethods 跨域运行的方法
- json相关
UniteJsonConfig <summer.json-config>
- 设置日期格式化;
- 设置jackson格式化,包括忽略不存在的属性,忽略重复属性;
- JsonUtils可以手动序列化和反序列化,与系统默认保持一致。
关于Long类型格式化
js不支持Long,如果主键是Long类型,直接返回的话js无法使用,通过使用jackson的ObjectMapper的SimpleModel设置String和Long类型在前后台进行转换,具体见:UniteJsonConfig.setJsonMapper()
关于Redis格式化
为了使redis具有可读性,value使用json格式,具体设置见DefaultRedisCacheConfig
redis能够反序列化json格式,需要携带类型名,需要在jackson的ObjectMapper中设置携带类型名,具体见UniteJsonConfig.setRedisMapper()
- redis相关
UniteRedisConfig <summer.redis-config>
DefaultRedisCacheConfig - 设置redis的key和value格式化,使用jackson进行格式化,在webapi的RedisConfig进行设置,具体见代码。
- jwt相关
UniteJwtConfig <summer.jwt-config>
设置jwt相关参数,包括发行人,身份,角色等
- tokenExpired 设置jwt过期时间,默认三天
- tokenSecret 设置jwt密钥,算法使用HmacSHA512,使用此密码进行加密。
- validator相关
接口输入验证是一个高频使用功能,如果使用if判断会非常繁琐,代码丑陋,系统使用java规范JSR303并结合Spring的@Validated
flower-webapi/src/main/java/plus/cove/flower/webapi/controller/DistrictController.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)
在JSR303基础上,增加部分通用验证器,包括中文校验,日期范围校验,手机号检验,同时支持ValidatorUtils手动校验。
使用方法
DistrictController的class上增加@Validated
DistrictController的method的参数上增加@Valid
如果校验失败则抛出ConstraintViolationException或MethodArgumentNotValidException异常,通过@ControllerAdvice截获异常,具体见 [flower-webapi/src/main/java/plus/cove/flower/webapi/config/WebResponseException.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)]
关于集合校验,需要在手动CollectionValidator,具体见WebMvcConfig-getValidator()
实战篇-项目架构,原则和分层
实战篇-基础设施,基类与配置
实战篇-接口实现,配置和部署
实战篇-仓储技术选型
实战篇-工具类实战
网友评论