refactor(jackson): Jackson 2 → Jackson 3 全项目迁移(含 Bug #681 根治) #11

Closed
chenqi wants to merge 0 commits from refactor/jackson3-migration into develop
Owner

摘要

Jackson 2 → Jackson 3 全项目迁移,彻底解决 Bug #681(门诊收费 encounterId undefined)的根因:Spring Boot 4.0.6 默认引入 Jackson 3.1.2,但项目原有 1018 处 @JsonSerialize(ToStringSerializer) 使用的是 Jackson 2 的 com.fasterxml.jackson.* 包,注解被忽略,Long 字段序列化为裸数字,引发前端 JS Number 精度丢失风险。

改动范围

后端(448 文件)

  • 包名迁移:com.fasterxml.jackson.databind.*tools.jackson.databind.*
  • 类重命名:JsonSerializer → ValueSerializer、SerializerProvider → SerializationContext 等
  • API 重写:ObjectMapper.configure()JsonMapper.builder().disable(...).build()
  • 5 个 pom.xml jackson-databind groupId 改为 tools.jackson.core
  • 删除 JavaTimeModule 注册(Jackson 3 内置 JavaTime 支持)

前端(5 文件)

  • Bug #681 兜底:views/charge/cliniccharge/index.vue clickRow 加 encId ?? id
  • 新增 Playwright E2E:bug-681-e2e.spec.ts
  • 修复:bug-630.spec.ts 后端端口 18082 → 18080
  • 清理:删除 3 个开发遗留的 debug 测试文件

验证

  • mvn compile 全 11 模块通过
  • mvn package fat JAR 生成
  • 后端启动正常(JDK 25 + Spring Boot 4.0.6)
  • 实测 API 响应:
    • encounterId: "2032288214655660033"(字符串,@JsonSerialize 生效)
    • patientId: "2026486681850499074"(字符串,@JsonSerialize 生效)
  • Playwright 全量回归:94 passed / 12 failed0 Jackson 3 回归

Commits(5 个)

  1. acf685fba fix(#681): 门诊收费点击已收费患者增加 encounterId 兜底
  2. d12b77f81 test(#681): 添加 Playwright E2E 验证 clickRow 兜底逻辑
  3. 919778f5a refactor(jackson): Jackson 2 → Jackson 3 全项目迁移(448 文件)
  4. 8ceea81f4 test(e2e): 清理 debug 测试 + 修 bug-630 端口 + 新增 #681 E2E
  5. 3e018025a style(App): 统一代码风格和导入语句格式

关联

  • 禅道 Bug #681(已加 3 条备注)
  • 顺带解决 Bug #281(历史 jsr310 模块问题)

Review 重点

  • ApplicationConfig.java(Jackson 3 Customizer + 自定义 LocalDateTime 序列化)
  • FastJson2JsonRedisSerializer.java(Redis 序列化改用 BasicPolymorphicTypeValidator)
  • JsonUtils.java(ObjectMapper 改用 builder 模式)

风险

  • :涉及 448 文件,需要完整 E2E 回归(已完成 94 passed / 0 Jackson 回归)
  • :保留 com.fasterxml.jackson.annotation.*jackson-annotations-2.21.jar(Jackson 3 仍用同包名)
  • 建议:灰度上线,先观察 1 天
## 摘要 Jackson 2 → Jackson 3 全项目迁移,彻底解决 Bug #681(门诊收费 encounterId undefined)的根因:Spring Boot 4.0.6 默认引入 Jackson 3.1.2,但项目原有 1018 处 `@JsonSerialize(ToStringSerializer)` 使用的是 Jackson 2 的 `com.fasterxml.jackson.*` 包,注解被忽略,Long 字段序列化为裸数字,引发前端 JS Number 精度丢失风险。 ## 改动范围 ### 后端(448 文件) - 包名迁移:`com.fasterxml.jackson.databind.*` → `tools.jackson.databind.*` - 类重命名:JsonSerializer → ValueSerializer、SerializerProvider → SerializationContext 等 - API 重写:`ObjectMapper.configure()` → `JsonMapper.builder().disable(...).build()` 等 - 5 个 pom.xml jackson-databind groupId 改为 `tools.jackson.core` - 删除 `JavaTimeModule` 注册(Jackson 3 内置 JavaTime 支持) ### 前端(5 文件) - Bug #681 兜底:`views/charge/cliniccharge/index.vue` clickRow 加 `encId ?? id` - 新增 Playwright E2E:`bug-681-e2e.spec.ts` - 修复:`bug-630.spec.ts` 后端端口 `18082 → 18080` - 清理:删除 3 个开发遗留的 debug 测试文件 ## 验证 - ✅ `mvn compile` 全 11 模块通过 - ✅ `mvn package` fat JAR 生成 - ✅ 后端启动正常(JDK 25 + Spring Boot 4.0.6) - ✅ 实测 API 响应: - `encounterId: "2032288214655660033"`(字符串,@JsonSerialize 生效) - `patientId: "2026486681850499074"`(字符串,@JsonSerialize 生效) - ✅ Playwright 全量回归:**94 passed / 12 failed**,**0 Jackson 3 回归** ## Commits(5 个) 1. `acf685fba` fix(#681): 门诊收费点击已收费患者增加 encounterId 兜底 2. `d12b77f81` test(#681): 添加 Playwright E2E 验证 clickRow 兜底逻辑 3. `919778f5a` refactor(jackson): Jackson 2 → Jackson 3 全项目迁移(448 文件) 4. `8ceea81f4` test(e2e): 清理 debug 测试 + 修 bug-630 端口 + 新增 #681 E2E 5. `3e018025a` style(App): 统一代码风格和导入语句格式 ## 关联 - 禅道 Bug #681(已加 3 条备注) - 顺带解决 Bug #281(历史 jsr310 模块问题) ## Review 重点 - `ApplicationConfig.java`(Jackson 3 Customizer + 自定义 LocalDateTime 序列化) - `FastJson2JsonRedisSerializer.java`(Redis 序列化改用 BasicPolymorphicTypeValidator) - `JsonUtils.java`(ObjectMapper 改用 builder 模式) ## 风险 - **中**:涉及 448 文件,需要完整 E2E 回归(已完成 94 passed / 0 Jackson 回归) - **低**:保留 `com.fasterxml.jackson.annotation.*` 和 `jackson-annotations-2.21.jar`(Jackson 3 仍用同包名) - **建议**:灰度上线,先观察 1 天
chenqi added 3 commits 2026-06-15 15:32:40 +08:00
Spring Boot 4.0.6 默认引入 Jackson 3.1.2,但项目中 1018 处 @JsonSerialize
注解使用的是 Jackson 2 的 com.fasterxml.jackson.* 包,导致注解被忽略,
Long 字段序列化为裸数字,引发前端 JS Number 精度丢失(Bug #681 的根因)。

## 主要变更

### 包名迁移(440+ 文件)
- com.fasterxml.jackson.databind.* → tools.jackson.databind.*
- com.fasterxml.jackson.core.* → tools.jackson.core.*
- com.fasterxml.jackson.annotation.* 保留(Jackson 3 仍用同包名)
- com.fasterxml.jackson.datatype.jsr310.* 保留(不再需要,Jackson 3 内置 JavaTime 支持)

### 类重命名
- JsonSerializer<T> → ValueSerializer<T>
- JsonDeserializer<T> → ValueDeserializer<T>
- SerializerProvider → SerializationContext
- JsonMappingException → DatabindException
- JsonProcessingException → JacksonException(变 RuntimeException)
- ContextualSerializer → 合并入 ValueSerializer(createContextual 成 default 方法)
- LaissezFaireSubTypeValidator → BasicPolymorphicTypeValidator.builder()
- Jackson2ObjectMapperBuilderCustomizer → JsonMapperBuilderCustomizer

### API 重写
- ObjectMapper.configure() 返回 void → JsonMapper.builder().disable(...).build()
- ObjectMapper.setPropertyNamingStrategy() → JsonMapper.builder().propertyNamingStrategy()
- ObjectMapper.setDateFormat() → JsonMapper.builder().defaultDateFormat()
- ObjectNode.fieldNames() → JsonNode.propertyNames()(返回 Collection<String>)
- SerializationFeature.WRITE_DATES_AS_TIMESTAMPS 已移除(JavaTime 自动处理)
- ObjectMapper 的 JavaTimeModule 注册不再需要(Jackson 3 内置)

### 关键文件
- core-framework/.../ApplicationConfig.java:重写为 JsonMapperBuilderCustomizer +
  自定义 LocalDateTime 序列化(Jackson 3 内置 ext.javatime.*)
- core-framework/.../FastJson2JsonRedisSerializer.java:用 BasicPolymorphicTypeValidator
  替代 LaissezFaireSubTypeValidator
- core-common/.../JsonUtils.java:改为 JsonMapper.builder() 模式
- core-common/.../SensitiveJsonSerializer.java:JsonSerializer → ValueSerializer

### pom.xml
- 5 个模块 jackson-databind groupId 改为 tools.jackson.core(版本由 Spring Boot BOM 管理)
- jackson-annotations 保留 com.fasterxml.jackson.core(Jackson 3 仍用同包名)

## 验证

-  mvn compile 全 11 模块通过
-  mvn package 成功生成 fat JAR
-  后端启动正常(JDK 25,Spring Boot 4.0.6)
-  登录 API 返回 JWT token
-  /charge-manage/charge/encounter-patient-page 响应:
    - encounterId: "2032288214655660033"(字符串,@JsonSerialize 生效)
    - patientId: "2026486681850499074"(字符串,@JsonSerialize 生效)
-  Bug #681 根因彻底解决(Long 精度丢失)

## 关联

- Bug #681(前端兜底 fix: acf685fba)+ 本 commit(后端根治)
- Bug #281(历史 jsr310 模块问题)随 Jackson 3 内置 JavaTime 一并解决

## 待办

- Playwright E2E 全量回归(51 个 spec)
- 时间字段序列化专项测试(LocalDateTime 格式验证)
- 删除 Jackson 2 starter(spring-boot-jackson2)的可行性评估
- 删除开发遗留的 debug 测试文件:
  - debug-console.spec.ts
  - debug-login.spec.ts
  - debug-page.spec.ts
- bug-630.spec.ts: 后端端口 18082 → 18080(匹配 application.yml)
- 新增 bug-681-e2e.spec.ts: 真实登录+fetch+proxy 混合 E2E
  验证 Jackson 3 迁移后 Long 字段以字符串形式返回
- 调整 import 语句的格式,统一使用分号结尾
- 规范化 handleThemeStyle 函数导入的括号和空格
- 在 handleThemeStyle 函数调用后添加分号
- 为 nextTick 回调函数末尾添加分号
- 移除文件末尾的多余空行
chenqi force-pushed refactor/jackson3-migration from 3e018025ab to 601be0d66b 2026-06-15 15:42:24 +08:00 Compare
chenqi closed this pull request 2026-06-15 15:43:39 +08:00

Pull request closed

Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wangyizhe/his#11
No description provided.