- 工单 #1510 / PR #1511-1515 合并到 dev - 修复 48 处低成本违规 (C4 字段注入/C19 success(null)/C-MAPPER-SQL 注解 SQL/C5 事务内 Feign/C3 缺 @Valid 等) - 唯一对前端有影响: PR #1515 mp 服务 4 处 Feign Fallback 行为变更 (success(null)→error),仅熔断场景生效 - 6 个业务服务全量重新部署 (因 hl-common 改动) - 余 336 违规留 Phase 2/3 独立任务跟踪
5.5 KiB
5.5 KiB
重构:80 PR 代码规范循环审查 Phase 1 批量修复(5 PR)
类型: 内部重构(对前端基本零影响 + 1 处 Feign Fallback 行为变更) 关联: 工单 #1510 / PR #1511 #1512 #1513 #1514 #1515 日期: 2026-04-27 影响范围: 6 个后端服务全量(common/user/resource/order-v2/product-v2/mp),全部需重新部署
背景
派 6 个 /@cr 并行审查 wx 最近 80 个已合并业务 PR (#1345 ~ #1505) 涉及的 437 个 Java 文件,对照 docs/CODE_RULES.md 找出违反规范的代码。Round 1 共发现 384 处违规 (P0=225 / P1=72 / P2=62)。
本批 Phase 1 修复 48 处低成本违规 (剩 336 处分 Phase 2/3 独立任务跟踪)。
5 个修复 PR
| PR | 模块 | 修/总 | 主修内容 | 合并 commit |
|---|---|---|---|---|
| #1511 | hl-common | 5/5 | GlobalExceptionHandler 4 处 @Autowired 字段注入改构造器(ObjectProvider 包装可选依赖) + Result.success() 重构(避免传 null) | 9c6d167e |
| #1512 | hl-user-service | 13/19 | 4 个 Mapper @Select/@Update 注解 SQL 改 default+QueryWrapper 聚合方法 + 3 处字段注入构造器化 + 2 处缺失 @Valid 补全 + 4 处 success(null)→success() | 063475a6 |
| #1513 | hl-resource-service | 11/12 | 9 个资源 service 的通知类 monitorFeign 调用从 @Transactional 内移到 afterCommit(register + 非事务兜底 + effectively final) + 1 处 @Valid 补全 | 5a1cb159 |
| #1514 | hl-order-service-v2 | 10/14 | 2 处 @Autowired 字段→构造器 + 3 处 new ObjectMapper→注入 + 2 处 @Valid 补全 + 2 处 BeanUtil 后显式 set 防 enum→String 字段吞 + TierInfoResolver static 工具类改 @Component(4 个 caller 同步) | d5c4df29 |
| #1515 | hl-product-service-v2 + hl-mp-service | 9/9 | 6 处 success(null)→success() + 2 处 ObjectMapper/RestTemplate 改注入(新增 RestTemplateConfig @Bean) + 1 处字段注入构造器化 + 2 个 Feign Fallback 行为变更 | 877f22b5 |
⚠️ 唯一对前端有影响的变更:Feign Fallback 行为
PR #1515 调整了 mp 服务的 2 个 Feign Fallback Factory 共 4 处:
改前
// MpProductFeignFallbackFactory.getEarliestBookingDate
@Override
public Result<EarliestBookingDateVO> getEarliestBookingDate(Long productId) {
return Result.success(null); // 静默"伪装成功"返回 null data
}
改后
@Override
public Result<EarliestBookingDateVO> getEarliestBookingDate(Long productId) {
return Result.error("产品服务不可用,请稍后重试"); // 显式失败
}
受影响的接口(4 处)
| Fallback Factory | 方法 | 原行为 | 新行为 |
|---|---|---|---|
| MpProductFeignFallbackFactory | getEarliestBookingDate | code=200, data=null |
code≠200, message="产品服务不可用,请稍后重试" |
| MpOrderFeignFallbackFactory | getPreTripChecklist | code=200, data=null |
code≠200, message="订单服务不可用,请稍后重试" |
| MpOrderFeignFallbackFactory | matchEarlyBird | code=200, data=null |
code≠200, message="订单服务不可用,请稍后重试" |
| MpOrderFeignFallbackFactory | validateEarlyBirdPlan | code=200, data=null |
code≠200, message="订单服务不可用,请稍后重试" |
触发条件
仅当上游服务(product-v2 / order-v2)完全不可达 + 本地熔断打开时才触发 Fallback。正常请求/业务异常等都仍按原 code 返回,未受影响。
前端处理建议
- 这 4 个接口的 mp 端调用方,必须判
result.code决定走业务分支还是降级 UI:result.code === 200 && result.data→ 业务正常渲染result.code !== 200→ 显示降级提示(按 result.message 文案 + toast/弹窗,不要再当成 success-空数据展示)
- 正常业务逻辑不需要改(本变更只在熔断场景生效,日常 99.9%+ 场景行为完全等价)
其余 4 PR 对前端影响
零影响。全部是后端内部重构,对外 API 行为完全等价:
- 字段注入改构造器注入 → JVM 内部 bean 装配方式变化,接口调用方无感知
- @Valid 补全 → 接口校验更严,本来该被前端校验拦住的非法请求,现在后端也兜住,前端无须改
- success(null) → success() → JSON 返回
{"code":200,"message":"成功","data":null},字节级等价 - Mapper @Select 改 default+WrapperX → SQL 输出等价,接口数据完全一致
- afterCommit 改造 → 通知类 Feign 异步执行时机微调(事务提交后才发 monitor 日志),接口响应时间略有缩短,接口数据完全一致
- BeanUtil 后显式 set → 防 enum→String 字段值丢失(原来是 BUG 修复变更前可能 null),前端拿到的值是真实值,这是正面修复
后端编译/部署
- ✅ 5 个 PR 各自
mvn compile -pl <module> -am单独编译通过 - ⏭️ 部署: 因 hl-common 改动,需全量重新部署 6 个业务服务 (gateway/user/resource/product-v2/order-v2/mp)
- 测试服部署后请优先回归 mp 端 4 个 Fallback 接口熔断场景(可暂停 product-v2/order-v2 触发熔断验证 Fallback 不再返 success-null)
留 Phase 2/3 (后续独立任务)
- Phase 2 中等成本 (估 ~120 P0): C2 Service 构造 Wrapper 下沉 / C27 Map 传数据→VO / C29 Service 接收 ReqVO / C1 Controller 业务下沉
- Phase 3 架构级重构 (估 ~120 处): C-ONE-MAPPER 拆 Service (40 P0) / C-SIZE 类体积超 300 (58 处, HotelService 952 / ScenicSpotService 937 等) / C17 状态机 if-else / C-DI-LIMIT Service 依赖>7
详见 docs/tasks/20260427_审查_最近80个PR循环审查.md 与 test/cr-audit-data/round1/AGGREGATE-report.md。