从维护线回流认证修复,保留 dev 原有第三方平台版本。Current 继续消费 2.9.0.1-rc3,不能混用本开发快照。后续正式发布须成对选择不可变新版本,禁止覆盖已有 2.9.2。
- common 使用 JDK 集合类及 jjwt-jackson 运行依赖,两种签名格式均需通过运行包验证。
- boot 访问认证仅接受 access,refresh 仅用于刷新接口。报表/WebSocket 调用方应持有 access 并正常刷新。
- 旧无 jti JWT 及其刷新祖先需重新登录,切换 v2 访问缓存命名空间;同一应用认证实例协调切换,无需清空 Redis。
- 保留重复会话拒绝及撤销;回滚不得恢复已确认错误的认证路径。
- 使用 JDK17,先安装 common 与两个独立 BOM,再测试、编译、安装 boot;使用独立 Maven 仓和空闲 Redis 测试端口隔离业务服务。
- 在 boot 执行
python3 script/verify-jwt-runtime/verify.py /path/to/eap-server.jar --java-home /path/to/jdk17。仅使用包内依赖,两种格式各 10,000 次校验算法、jti 和唯一性,不能以静默回退作为兼容验证成功。 - 下游消费前验证远端解析、依赖树及登录/刷新/登出。不包含生产发布或业务数据迁移授权。
适用:
eap-common、eap-boot及所有基于 EAP BOM / Starter 的下游应用。 原则:版本与默认行为优先跟随 Spring Boot 官方 BOM;会破坏存量行为的兼容能力一律做成具名开关、默认关闭。
| 组件 | 版本 | 说明 |
|---|---|---|
| JDK | 17 | 编译与运行均要求 17(本机默认常为 21/25,编译前先核对 mvn -version) |
| Spring Boot | 3.5.16 | BOM 基线 |
| Spring Framework | 6.2.19 | 由 Boot BOM 管理 |
| Spring Data | 2025.0.13(Redis 4.1.x) | 由 Boot BOM 管理 |
| Spring AMQP | 3.2.12 | 可信包默认收紧自 3.2.11 起 |
| Spring Cloud | 2025.0.1 | eap-cloud-dependencies |
| Spring Cloud Alibaba | 2025.0.0.0 | 内置 nacos-client 3.0.3,兼容 nacos-server 2.x,服务端无需升级 |
| MyBatis-Plus | 3.5.16 | 经 mybatis-plus-bom 统一管理 |
| jsqlparser | 5.2(默认)/ 4.9(应用可选) | 停在 4.9 见 §4.3 |
| POI | 5.4.0;poi-ooxml-schemas 4.1.2 |
见 §4.2 |
| revision | 2.9.2 | eap-common / eap-boot / eap-dependencies / eap-cloud-dependencies 四处同步 |
兼容跨度:2.9.x 为 JDK 17 + Spring Boot 3.5.16 基线。从 2.8.x(Boot 3.4.x/3.5.x)升级属 minor 升级, 无包名与自动配置机制断裂;从 Boot 2.x 升级需先完成 JDK 17 与
javax → jakarta迁移。
- 环境:
export JAVA_HOME=$(/usr/libexec/java_home -v 17),确认mvn -version为 17。 - 升级并安装 eap-common(必须走 flatten):
cd eap-common && mvn -DskipTests install
不要加
-Dflatten.skip=true:安装到本地仓库的 pom 会残留${revision}占位符, 导致 eap-boot 解析eap-boot-common:${revision}失败。 - 验证 eap-boot:
cd ../eap-boot mvn -q -U -DskipTests -Dflatten.skip=true compile mvn -q -Dflatten.skip=true test
- 下游应用:将
eap.version(或eap-boot.version)改为2.9.2;BOM 导入结构无需调整。 - 全量
mvn clean compile -DskipTests+ 关键链路回归后再上线。
- RabbitMQ 转换器
EapRabbitMQAutoConfiguration#createMessageConverter增加@ConditionalOnMissingBean(MessageConverter.class): 应用未自定义时行为不变;已自定义时默认 Bean 自动退让,保证ObjectProvider#getIfUnique()能选到唯一候选。- 新增
org.openea.eap.framework.mq.rabbitmq.core.TrustedRootJackson2JavaTypeMapper:一个根包覆盖其下所有子包, 替代“逐包枚举、新增消息包就复发”的写法。
- POI 死坐标修正:
poi-ooxml-schemas由${poi.version}=5.4.0改为独立属性4.1.2(该构件 POI 5.x 起已停发, 最后一个真实版本是 4.1.2);poi/poi-ooxml仍保持 5.4.0(easyexcel 4.0.3 需要 POI 5.x)。 - 版本一致性:
eap-dependencies、eap-cloud-dependencies为 standalone pom,不继承根${revision}, 本版同步升到 2.9.2;否则mvn读取 POM 阶段即报Non-resolvable import POM。 - 评估文档:新增
doc/2.9.2-升级下游回迁评估.md,记录下游升级改动的回迁结论与后续方案。
2.9.2 无破坏性 API 变更:新增类为纯新增,BOM 变更向后兼容,接收方可先升版本再按 §四 逐项核对。
Spring AMQP ≥ 3.2.11 把无参 Jackson2JsonMessageConverter 的默认可信包由 * 收紧为 [java.util, java.lang]。
收发自定义消息类型的应用必须自定义受信转换器:
@Bean
@Primary // 多候选时保证 getIfUnique() 能选中,否则监听容器会静默退回 SimpleMessageConverter
public Jackson2JsonMessageConverter rabbitMessageConverter() {
Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter();
converter.setJavaTypeMapper(new TrustedRootJackson2JavaTypeMapper("org.openea.eap"));
return converter;
}- 生产端
RabbitTemplate与消费端@RabbitListener共用同一转换器,保证__TypeId__对称读写。 - 历史消息若缺
__TypeId__,重放前必须补齐。
BOM 只修复“坐标不存在”的解析失败;仍使用 easypoi 4.x 的应用需继续在应用侧钉 POI 4.x(属应用依赖选择,不是 BOM 缺陷)。
- 应用根 POM 钉
com.github.jsqlparser:jsqlparser:4.9;mybatis-plus-jsqlparser-4.9无需声明版本(BOM 已管理)。 - 排除
eap-spring-boot-starter-mybatis传递的mybatis-plus-jsqlparser(按 5.x 编译,与 4.9 混用会在分页/多租户拦截器运行期NoSuchMethodError)。 - 启动模块显式引入
mybatis-plus-jsqlparser-4.9。
- 注意:
ParenthesedSelect需取getSelect()再判断PlainSelect,直接instanceof会静默不裁剪。
- 驱动跟随 Boot BOM(9.x),不要降级,也不要再使用
mysql:mysql-connector-java旧坐标。 - Connector/J ≥ 8.0.23 起 DATETIME 的
getObject()返回LocalDateTime,存量(Date)强转会抛ClassCastException: 用官方参数treatMysqlDatetimeAsTimestamp=true兼容,或把代码改造为java.time。
不要以同 FQCN 整体拷贝 starter 类(如 EapWebAutoConfiguration)做定制,应改为注册增量 HttpMessageConverter Bean。
整类拷贝会随上游签名变更静默漂移(例如 ApiErrorLogApi → ApiErrorLogCommonApi)。
Redis Stream pending 无限重投:消费异常不 ack,RedisPendingMessageResendJob 把 pending 复制成新记录,
业务持续失败时每 5 分钟复制一次。2.9.2 期间需在业务消费者做幂等短路;框架侧治理方案见评估文档 §5.1。
- JWT 新旧签发路径新增随机
jti,现有generateJwtToken方法签名以及username、sub等既有 claims 不变。 - 已签发的旧 token 仍按原方式校验;旧消费者会忽略不认识的
jti,无需同步改造。 - 兼容期可通过
JwtUtil.isJwtWithoutId识别无jti的历史 JWT,并执行更严格的持久化校验;UUID 等 不透明 token 不会被误判,不影响非 JWT 模式的缓存性能。 jti只负责令牌唯一性,不替代业务身份:平台内部仍使用userId,外部系统关联仍使用userKey。
生产代码不要使用 assertj 工具类(org.assertj.core.util.*),改用 JDK 集合或 hutool。
doc/2.9.2-升级下游回迁评估.md:下游升级改动回迁结论、jsqlparser 配方、后续治理方案。AGENTS.md:协作约定与构建/验证命令。README.md:模块结构与部署边界。