✨ 添加 DistributedLock 在获取锁失败时可以进行自旋重试的能力。
✨ @Cached
注解默认进行 3 次自旋尝试,可通过属性 retryCount 进行修改。
X-Trace-Id
,之前为 traceId
,注意调整代码或修改配置(ballcat.web.trace-id-header-name)ballcat.log.access.filter-order
用于配置访问日志的过滤器优先级,默认值 -1000涉及模块:ballcat-common-core、ballcat-common-model、ballcat-common-util
涉及模块:ballcat-spring-boot-starter-datascope
涉及模块:ballcat-extend-dingtalk
涉及模块:ballcat-spring-boot-starter-grpc
SecurityFilterChain
AuthenticationManagerConfiguration
DaoAuthenticationProvider
进行认证操作,避免 AuthenticationManager
与 Provider
之间的循环依赖ballcat.oss.chunked-encoding
配置,用于控制是否进行分块传输,默认为 false (#250)数据权限中 DataScope
不兼容更新,getTableNames 修改为 includes
Redis 组件中的 ballcat.redis.locked-time-out
配置修改为ballcat.redis.default-lock-timeout
并修改默认值为 10s
spring-javaformat 新版本优化了链式调用代码的格式化,更新后重新 format 代码,会导致大量文件更新。
授权服务器的登录验证码开关默认值切换为 false,开启了验证码校验的注意修改对应配置为 true.
ballcat-admin-core 模块不再默认开启资源服务器的配置,需要用户在自己的配置类上手动添加 @EnableOauth2ResourceServer
注解。
ballcat-admin-core 不再传递授权服务器的依赖,用户根据自己的需要在配置类上添加对应的注解,以及 pom.xml 中引入对应的依赖:
切换到 spring authorization server
<!-- 基于 spring authorization server 的授权服务器 -->
<dependency>
<groupId>com.hccake</groupId>
<artifactId>ballcat-spring-security-oauth2-authorization-server</artifactId>
</dependency>
添加注解 @org.ballcat.springsecurity.oauth2.server.authorization.annotation.EnableOauth2AuthorizationServer
或者继续使用 spring-oauth2
<!-- 已废弃,基于 spring oauth2 的授权服务器 -->
<dependency>
<groupId>com.hccake</groupId>
<artifactId>ballcat-auth-controller</artifactId>
<scope>provided</scope>
</dependency>
添加注解 @com.hccake.ballcat.auth.annotation.EnableOauth2AuthorizationServer
spring authorization server 的登陆和退出端点变更为 /oauth2/token
和 /oauth2/revoke
,请求方式也略有不同,请注意同步前端更新
涉及模块:ballcat-spring-security-oauth2-authorization-server
BallcatOAuth2TokenCustomizer
,方便做远程 token 自省@EnableOauth2AuthorizationServer
注解显式开启AnonymousForeverAuthenticationProvider
,用于在使用错误 token 的访问资源时不终止流程,而是切换身份到匿名用户访问OAuth2AuthorizationObjectMapperCustomizer
类,方便用户扩展 OAuth2Authorization 的序列化逻辑涉及模块:ballcat-spring-security-oauth2-resource-server
涉及模块:ballcat-common-core、ballcat-common-model、ballcat-common-util
涉及模块:ballcat-common-desensitize
涉及模块:ballcat-spring-boot-starter-ip2region
涉及模块:ballcat-common-redis、ballcat-spring-boot-starter-redis
ballcat.redis.locked-time-out
配置修改为ballcat.redis.default-lock-timeout
并修改默认值为 10s涉及模块:ballcat-spring-boot-starter-datascope
新增 DataPermissionUtils#executeAndIgnoreAll
方法,方便忽略数据权限进行方法执行
DataScope
使用 includes
方法替换原 getTableNames
方法,以便支持更加多元化的方式来判断是否需要控制当前表
涉及模块:ballcat-extend-mybatis-plus
涉及模块:ballcat-extend-ntp
涉及模块:ballcat-extend-dingtalk
此版本移除了 ballcat 的 pom 中配置的 maven resource filter 控制,会导致 application.yml 中的 @profiles.active@
等占位符无法正确解析替换,注意在自己项目的 pom.xml 中添加对应的 maven resource filter 配置。
配置方式参看: Maven 占位符配置
涉及模块:ballcat-spring-boot-starter-job
涉及模块:ballcat-spring-boot-starter-ip2region
涉及模块:ballcat-common-redis、ballcat-spring-boot-starter-redis
涉及模块:ballcat-spring-boot-starter-datascope
涉及模块:ballcat-spring-boot-starter-easyexcel
@ResponseExcel
导出的校验:fill 属性必须配合 template 使用EmptyHeadGenerator
组件,用来忽略 excel 头生成此版本移除了 @EnableAccessLog
和 @EnableOperationLog
注解,访问日志和操作日志将默认启用,用户可以使用
ballcat.log.access.enabled=false
和 ballcat.log.operation.enabled=false
配置来进行关闭
OssClient
OssTemplate
组件domain
属性配置,可用 endpoint
属性配置替代,endpoint
属性配置兼容端点与自定义域名endpoint
属性配置需配置协议头,例如:http://s3-cn-east-1.qiniucs.com
rootPath
属性配置(可用 object-key-prefix
属性配置替代)ballcat
spring-boot-configuration-processor
的依赖传递内置默认的日志配置类,并根据当前使用的授权服务器注入不同的登陆处理器
涉及模块:ballcat-common-redis、ballcat-spring-boot-starter-redis
@CacheDel
注解增强为可重复注解RedisHelper
几个带过期时间的方法添加过期时间单位支持@CacheDel
注解添加 allEntries
属性,支持删除同一个命名空间下所有相关key涉及模块:ballcat-extend-mybatis-plus
WrapperX
组件新增 lambdaUpdate
方法涉及模块:ballcat-extend-openapi
SpringUtils
添加一个 publishEvent 发布事件方法SystemResultCode
添加部分常用状态码ballcat-spring-boot-starter-ip2region
模块,方便快速集成 Ip2region
涉及模块:ballcat-spring-boot-starter-job
@EnableXxlJob
注解, 用户现在可以通过 ballcat.xxl.job.enabled
为 false
来关闭 xxl-job 的使用涉及模块:ballcat-common-idempotent、ballcat-spring-boot-starter-idempotent
KeyGenerator
接口修改为 IdempotentKeyGenerator
, 防止自动配置和别的组件的 keyGenerator 重名导致的注册失败涉及模块:ballcat-spring-boot-starter-oss
domain
属性配置(可用 endpoint
属性替代, endpoint
兼容端点与自定义域名)endpoint
属性配置需配置协议头rootPath
属性配置 (可用 object-key-prefix
属性配置替代)enabled
属性配置,用于控制oss是否启用OssTemplate
组件,用以替代原 OssClient
组件ObjectWithGlobalKeyPrefixOssTemplate
支持原 OssClient 中配置的全局 key 前缀ballcat-common-security
模块进行拆分ballcat-security-core
模块,验证码 validator 迁入此模块方便复用ballcat.security.oauth2.resourceserver.ignore-urls
配置AuthenticationManager
交由授权服务器注册涉及组件:ballcat-spring-boot-starter-excel
DefaultAnalysisEventListener
添加 set 方法,便于 excel 导入时指定表头行数@RequestExcel
注解添加 headRowNumber 属性方便指定 Excel Head 行数涉及模块:ballcat-spring-boot-starter-web
application/json;charset=UTF-8
的 content-type
PageParamArgumentResolverSupport
类中一个错误的注释additional-spring-configuration-metadata.json
文件SpringUtils
中的 ApplicationContext 注入时机涉及模块:ballcat-common-log、ballcat-spring-boot-starter-log
使用 springdoc-openapi bom 进行相关依赖管理
依赖:
插件:
涉及模块:ballcat-common-core ballcat-common-util
AbstractQueueThread
中 getPollTimeoutMs 修饰符错误导致无法被子类覆写AbstractTimer
定时器线程涉及模块:ballcat-common-websocket ballcat-spring-boot-starter-websocket
RocketMQ
做为消息分发器的相关代码涉及模块:ballcat-common-redis ballcat-spring-boot-starter-redis
CacheLock
的 RedisScript 使用单例模式,防止产生不同的 sha 值RedisHelper
方法名重构,命名规则修改参考 redis 原生命令RedisHelper
添加 Stream
流相关使用方法以及其他数据结构的常用方法涉及模块:ballcat-extend-openapi
涉及模块:ballcat-common-log ballcat-log-biz ballcat-spring-boot-starter-log
涉及模块:ballcat-extend-mybatis-plus
ballcat.pageable.page-parameter-name
修改为之前版本的参数名 currentballcat.upms
下指定超级管理员的 id 和 username 的配置,移动到 ballcat.system
下了ballcat.web.max-page-size
现在改为 ballcat.pageable.max-page-size
@SneakyThrows
注解使用时显示指定异常类型I18nData
的 resultMap 中,字段 remark 多加了一个 s 的问题@I18nField
注解的 code 值支持使用 SPEL 表达式
@I18nIgnore
注解,可以添加在 controller 的方法上,用于指定忽略 I18n 处理DataPermissionRule
的构建方式,添加有参构造,以及支持链式调用DataPermissionHandler
的实例方法,抽取为 DataPermissionUtils
的一个静态方法,使用更加简单便捷DataScope
中执行 sql 导致嵌套执行拦截器,出现匹配计数空指针的问题ballcat.system.password-rule
PasswordUtils
的 encode
以及 matches
等方法,防止用户错误使用.PasswordUtils#createDelegatingPasswordEncoder
修改为 public 方法,方便外部调用[]
的方式进行传参,例如 sort
和 sort[]
都可以做为排序参数ballcat:
pageable:
page-parameter-name: page # 不想改动前端,这里可以修改为 current
size-parameter-name: size
sort-parameter-name: sort #同时会自动支持尾缀[]的参数形式,如 sort[]
max-page-size: 100
LambdaAliasQueryWrapperX
嵌套构建条件语句时别名丢失的问题LambdaAliasQueryX
的测试用例OtherTableColumnAliasFunction
类更名为 ColumnFunction
ColumnFunction#create
方法,在进行连表查询时,构建第三方表的列名更方便@OneOfStrings
校验值是否是指定的字符串之一@OneOfInts
校验值是否是指定的 int 值之一@OneOfClasses
校验值是否是指定的 class 类型之一@ValueOfEnum
校验值是否满足于指定的 Enum此版本操作日志表有字段新增,升级前注意先执行对应的增量 SQL
访问日志的忽略 url 现在只需填写 servlet 内的路径了,升级后请注意调整,防止失效
openapi 的配置文件调整,现在文档基本信息的属性添加了一个 info 的前缀
WebSocket 组件中的 AbstractJsonWebSocketMessage
改名为 JsonWebSocketMessage
,升级时如遇到 class import 失败,请注意对应修改类名
由于 spring-javaformat 组件的升级,现在如果在 jdk8 环境下,请在项目跟目录新建一个名为 .springjavaformatconfig
的文件,文件内容如下:
java-baseline=8
BusinessException
异常时,日志记录丢失 traceId
的问题CustomAccessLogHandler#getParams
改变不可变的 parameterMap 集合问题PageParam
的 valid 校验支持PageParam
分页条数上限可通过配置 ballcat.web.page-size-limit
动态修改,默认值 100RedisHelper
工具类添加 zset 的基本操作ballcat.redis.key-prefix
属性时启动报错的问题TreeUtils
新增剪枝方法 pruneTree
TreeUtils
泛型调整SimpleTreeNode.getChildren
方法重写,方便直接获取对应的类型数据DataPermissionAnnotationHolder
只清空了 deque,没有 remove 的问题@DataPermission
注解嵌套使用数据权限规则优先级,由高到低:
- 编程式规则
- 当前方法的注解规则
- 当前类的注解规则
- 调用者使用的权限规则
- 全局默认规则
WebSocketSessionHolder
修改为 WebSocketSessionStore
AbstractMessageDistributor
, 将MessageDistributor
的 default 方法下沉到该抽象类中allowed-origin-patterns
属性RedisMessageListener
的注册方式,防止误扫描导致的 bean 注册异常JsonWebSocketMessage
删除,原抽象类 AbstractJsonWebSocketMessage
改名为 JsonWebSocketMessage
springdoc.api-docs.enabled=false
的配置,则会导致启动报错spring.mvc.pathmatch.matching-strategy=ant-path-matcher
配置,以及注册 SpringfoxHandlerProviderBeanPostProcessor
到 spring 容器中spring.main.allow-circular-references = true
(不建议)JsonDesensitizeModule
的形式,以便复用 spring-boot 默认的 module 注册。CustomJavaTimeModule
的注册方式,防止被 JSR310 的 JavaTimeModule
覆盖IPageArgumentResolver
,让 starter-web 和 mybatis-plus 模块解耦。@ParameterObject
注解,以便在文档上正确展示查询入参File
直接上传的方法StreamUtils
克隆流方法优化. 使用 FileOutStream 保证不会因为文件过大而内存溢出OssDisabledException
父类由 Exception
修改为 RuntimeException
RedisIdempotentKeyStore
的 stringRedisTemplate 属性,改为构造器注入IdempotentAspect
切面的 @citizenl 注解,防止误注册FileUtils#updateTmpDir
方法中文件夹创建异常的问题saveBatchSomeColumn
切换到 saveBatch
后,注意项目中的 jdbcUrl 配置,需要添加 rewriteBatchedStatements=true 条件,否则插入效率降低LogicDeletedBaseEntity
,统一支持逻辑删除saveBatchSomeColumn
切换到 saveBatch
, 经实测,开启批处理事务以及 jdbcUrl 连接添加rewriteBatchedStatements=true
后, 循环 insert into 批量提交比 insert into values 语法速度更快。TreeUtils#treeToList()
方法,支持将树平铺为列表ImageUtils#mixResolveClone()
方法,先使用快速解析,若失败回退到正常解析方法FileUtils
工具类BaseEntity
和 LogicDeletedBaseEntity
实体类基类DistributeLock
, 更加方便的进行分布式锁的使用AbstractMessageEventListener
类,提供默认的消息序列化处理ExtendService#saveBatch()
方法MetaObjectHandler
@Async
异步线程日志支持 traceId 输出TokenGrantBuilder#getAuthenticationManager()
方法,方便子类继承时获取 AuthenticationManager (#133)FileService
,OssClient 不再为必须依赖,当没有配置 Oss 时,默认回退使用 FileClient,根据配置走本地存储或者MappedStatementIdsWithoutDataScope
的 WITHOUT_MAPPED_STATEMENT_ID_MAP
属性类型为 ConcurrentHashMap
TraceIdFilter
默认在响应头中返回 TraceId 参数,方便排查问题UserInfoCoordinator
从类调整为接口,并提供默认实现 DefaultUserInfoCoordinatorImpl
@DataPermission
注解的问题ballcat.swagger.enabled=false
的情况下,swagger 没有正常关闭的问题PlanTextMessageHandler
进行处理AccessTokenConverter
,修改自省端点 /check_token
的返回值TokenGrantBuilder
实现AuthenticationProvider
方便处理自定义的 grant_type{ active: false }
,而不是返回 400Instant
类型支持,防止在使用时出现异常 InvalidDefinitionException: Java 8 date/time type java.time.Instant
not supported by defaultrefactor:资源服务器对于客户端凭证生产的token 解析支持,对应的 userdetails 为 ClientPrincipal
refactor:授权服务器自省端点的 scope 属性响应调整,根据 OAuth2 自省端点协议,scope 应返回字符串,用空格间隔
refactor:数据权限调整
refactor:SelectData 试图对象中的 value 修改为 Object 类型,selected 和 disabled 修改为 Boolean 类型
refactor:系统用户相关的 service 和 mapper 层,修改使用 Collection 接收参数,方便使用
refactor:TokenAttributeNameConstants 常量类拆分
refactor:UserInfoDTO 属性调整,新增了 menus 用于存储用户拥有的菜单对象集合,修改 roles 属性用于存储用户拥有的角色对象集合,原 roles 属性修改为 roleCodes 存储角色标识集合
refactor:为避免歧义,登录和自省端点返回信息中的属性名称 roles 修改为 roleCodes
bug:修复使用 ballcat-spring-boot-starter-web 时,若没有引入 security 依赖则启动异常的问题
refactor: system 相关事件优化调整
refactor:ballcat-common-websocket 移除 MessageSender 接口,将其并入消息分发器 MessageDistributor
refactor:ballcat-spring-boot-starter-websocket 与 redis 解耦,将默认注册的消息分发器由 redis 改为 local,基于内存分发。可通过 ballcat.websocket.message-distributor 属性修改为 redis 或者 custom,值为 custom 表示,用户自己定制 MessageDistributor(如修改为使用 mq,可用性更高)
ballcat:
websocket:
# 默认为 local 仅支持单节点使用,redis 基于 PUB/SUB 消息订阅支持了集群下的消息推送问题
message-distributor: redis # local | redis | custom
refactor:ballcat-spring-boot-starter-redis 调整 AddMessageEventListenerToContainer 的注册方式,防止用户配置包扫描导致的加载顺序异常
refactor:有用户绑定组织时,不允许删除组织
OperationLogHandler
的相关方法,如果有自定义 OperationLogHandler ,需要注意同步更新MessageEventListener
接口,ballcat-spring-boot-starter-redis 中会自动注册所有实现 MessageEventListener
接口的监听器@CacheDel
注解,新增 multiDel 属性,方便批量删除缓存CreateGroup
和 UpdateGroup
接口,方便分组校验使用spring-boot-starter-web
, 并使用 undertow 作为默认的嵌入式容器,且将 ballcat-common-conf 中对 web 应用的配置增强,如全局异常管理,以及 Sql 防注入处理,jackson 的默认配置等配置移动到此项目中OtherTableColumnAliasFunction
,方便使用 LambdaAliasQueryWrapperX
进行关联表查询条件的构建{}
进行占位表示,使用示例可参看 I18nData 的导出使用basePackage
,支持使用 ,
进行多包名的分割扫描refactor: ballcat-common-conf 内原先对于 mybati-plus 的自动填充、分页插件、以及批量插入方法注入的配置移动到 ballcat-admin-core 中
refactor: SpELUtils
改名为 SpelUtils
,并移动到 ballcat-common-util 模块中
refactor: ApplicationContextHolder
改名为 SpringUtils
,并移动到 ballcat-common-util 模块中
refactor: ballcat-spring-boot-starter-log 中拆分出 ballcat-common-log 模块,解决在 log-biz 模块中需要引入 starter 的问题,部分代码的包名有变更
refactor: ballcat-spring-boot-starter-redis 中拆分出 ballcat-common-redis 模块
refactor: 重构原先的国际化 i18n 功能,新增 ballcat-common-i18n 模块,移除原先的 ballcat-extend-i18n 模块
pref: 取消 ballcat-spring-boot-starter-web 中 spring-security-core 的传递依赖
fix: 修复当查询一个不存在的系统配置后,由于缓存空值,导致添加配置后依然查询不到的问题
pref: 菜单查询的返回类型修改为 SysMenuPageVO
fix: 修复 excel 导出的 content-type 和实际文件类型不匹配的问题
fix: 提高缓存切面的 Order,使其在事务提交后执行更新或删除操作,防止并发导致缓存数据错误
pref: 菜单支持删除 icon
fix: 修复当菜单 id 修改时,未级联修改其子菜单的父级 id 的问题
pref: 优化操作日志,改为在方法执行前获取方法参数信息,防止用户在执行方法时将方法入参修改了
pref: ballcat-admin-core 中默认扩展 springboot 默认的 TaskExecutor 配置,将拒绝策略从抛出异常修改为使用当前线程执行
refactor: 移动 TreeNode 模型到 common-util 包中,以便减少 common-util 包的依赖
refactor: ballcat-spring-boot-starter-xss 抽象出 XssCleaner 角色,用于控制 Xss 文本的清除行为,方便用户自定义
pref: 用户登陆时的错误信息返回原始的细节信息,而不是全部返回用户名密码错误
fix: ballcat-system-biz websocket 包名拼写错误修复
feat: 新增 ballcat-extend-redis-module 模块,提供对布隆过滤器的操作
feat: 新建用户时可以直接绑定用户角色,而不必分两次操作了
feat: 支持修改菜单ID,方便转移菜单位置时,保持菜单 ID 规则
feat: 新增 ballcat-common-security 模块
refactor: 数据权限 dataScopes 通过 ThreadLocal 进行方法间传递
refactor: 拆分 admin-websocket 模块,方便用户剔除不需要的组件.
refactor: ballcat-spring-boot-starter-websocket 模块中 websocket 相关的封装代码抽取到 ballcat-commo-websocket 模块,starter 仅保留自动配置相关代码
pref: 菜单的逻辑删除属性使用 mybatis-plus 的自动填充功能,且当菜单 ID 已使用时提示详情
pref: 精简了一些 common 模块中不需要的依赖
refactor: OAuth2 ResourceServer 底层从 spring-security-oauth2 依赖迁移至 SpringSecurity 5.x
pref: common-conf 中现在默认注册 jackson 的脱敏序列化器了,用户可以通过注册 name 为 ”desensitizeCustomizer“ 的 Jackson2ObjectMapperBuilderCustomizer bean,覆盖默认配置
refactor: ballcat-spring-boot-starter-log 和业务解耦,操作日志的生产和存储全部交由业务项目自己处理,ballcat-log-biz 模块中提供了默认的操作日志实体类,以及 OperationLogHandler 的默认实现
refactor: 由于 common-security 的抽取, ballcat-oauth 模块只剩下了授权相关,故更名为 ballcat-auth,同时做了一些结构上的调整,方便后续独立部署授权服务器。
ballcat.upms.loginCaptchaEnabled
现在调整为 ballcat.security.oauth2.authorizationserver.loginCaptchaEnabled
,用以控制登录验证码的开关ballcat.security.ignoreUrls
现在调整为 ballcat.security.oauth2.resourceserver.ignoreUrls
用以控制资源服务器对部分 url 的鉴权忽略ballcat.security.iframeDeny
现在调整为 ballcat.security.oauth2.resourceserver.iframeDeny
用于开启资源服务器的嵌入 iframe 允许@EnableOauth2AuthorizationServer
注解,用以开启授权服务器 (ballcat-admin-core 模块中默认开启)