2026-04-29-REQ-MOD-001.md
3.19 KB
req_id: REQ-MOD-001 date: 2026-04-29 round: 1
reviewer: superpower-code-reviewer
Review: REQ-MOD-001 — round 1
结论
approve
Must-fix
(无)
Nice-to-have
- backend/src/main/java/com/xly/erp/common/security/JwtAuthenticationFilter.java:20 —
@Component加在 servlet filter 上会被 Spring Boot 自动注册到原生 servlet 链上(与addFilterBefore重叠注册)。OncePerRequestFilter防住了重复执行,但顺序与作用域容易让人困惑。建议去掉@Component改在 SecurityConfig 用@Bean暴露,或追加FilterRegistrationBean<JwtAuthenticationFilter>并setEnabled(false)禁用原生注册。 - backend/src/main/java/com/xly/erp/module/mod/service/impl/ModuleServiceImpl.java:58 — stub 回退
stub.getStubUserNo()缺 spec/plan 约定的// REQ-MOD-001 stub: see USR-004 follow-up锚点;目前只有 SecurityConfig 一处带锚点,USR-004 上线时 grep 容易漏改这处。建议在该行加注释。 - backend/src/main/java/com/xly/erp/module/mod/entity/Module.java:11 — 类名
Module与java.lang.Module(JPMS)撞,未来 entity 与反射/模块 API 混用易踩坑。可考虑改名ModuleEntity/TModule,本 REQ 不强制。 - backend/src/main/java/com/xly/erp/common/exception/GlobalExceptionHandler.java:32 — 兜底
handleAny(Exception)会把HttpMessageNotReadableException(非法 JSON)/HttpRequestMethodNotSupportedException等框架级 4xx 转成 50000,掩盖请求格式错误。建议后续 REQ 增加专用 handler 返回 40001。 - backend/src/main/resources/application.yml:30 —
erp.security.jwt-secret: ${JWT_SECRET}没有 fail-fast 默认值,未来漏 export 时会用字面量当 secret。建议${JWT_SECRET:?JWT_SECRET 必须从 .env.local 注入}让缺失即启动失败。 - backend/src/main/java/com/xly/erp/common/security/JwtUtil.java:23 — 暴露了两个 public 构造器(
JwtUtil(String)实质只供测试用)。建议改 package-private 加// test-only,或在测试侧自行构造 StubSecurityProperties。 - backend/src/main/resources:0 — docs/09 § 二 列出的
application-dev.yml缺失。本 REQ 不强求,建议在模块完成报告 follow-up 列表中提一下。 - backend/src/test/java/com/xly/erp/module/mod/controller/ModuleControllerIT.java:142 —
postWithoutJwt_permitAllStub_returns200_andCreatedBySTUBADMIN用例硬写 STUB_ADMIN 期望,spec 已声明 USR-004 闭环后改 401。建议加@DisplayName或 javadoc 带REQ-MOD-001 stub: see USR-004 follow-up锚点便于 grep。
反例 / 测试覆盖缺口
Spec 验收清单(单测 6 + IT 7 + 工程脚手架 5)全部覆盖到位:surefire 报告 6 个 testsuite 共 26 用例,0 failure / 0 error;错误码 40001 / 40010 / 40020 / 40021 / 20001 全部端到端验证。
非阻塞可补缺口(留给后续 REQ):
-
@Size长度溢出(如sProcedureName> 100 字符)路径仅在『缺必填』用例顺带覆盖,没有独立断言。 -
iParentId指向bDeleted=1旧记录是否回 40021 没单独验证(目前只测了不存在的 99999999)。 - 非法 JSON body 落到
handleAny转 50000 的链路 spec 未列入,可在引入专用 4xx handler 时一起补。