fix(backend): 修复审核决策请求体契约不一致导致的 400
审核操作统一发送 {comment, reasonCodes[]}(数组),但 ReviewController 的
approve / need-evidence / approve-local-eligibility / reject-local-eligibility /
evidences/{id}/access 将 @RequestBody 声明为 Map<String,String>,数组值无法反序列
化成 String,Jackson 抛 HttpMessageNotReadableException,经 GlobalExceptionHandler
映射为 400「请求体格式错误」。
- 5 处 @RequestBody Map<String,String> 改为 Map<String,Object>,comment/purpose
读取加 (String) 强转(与原本正确的 needEdit/reject 一致)。
- 新增回归守卫 ReviewControllerRequestBodyContractTest(standalone MockMvc +
GlobalExceptionHandler + 自定义 @AuthenticationPrincipal 解析器),注入前端真实
载荷 {comment, reasonCodes:[]} 断言 200;直接 new 控制器测不到 HTTP/绑定层缺陷。
- 接入后端契约门禁 scripts/run-backend-contracts.mjs(CURATED 13 -> 14)。
- 负向注入已自证判别力:临时改回 Map<String,String> 精确判红 400,恢复后 5/5 绿。
This commit is contained in:
@@ -41,6 +41,10 @@ const backendTestRoot = resolve(root, 'backend', 'src', 'test', 'java')
|
||||
// MeRouteContractTest / CanonicalRouteContractTest
|
||||
// PhotoLimitGuardTest / PhotoLimitConcurrencyGuardTest / PhotoUploadValidationTest
|
||||
// OperatorAuthServiceTest
|
||||
// 第 14 项(2026-10-09):审核决策端点的「请求体契约」守卫 —— 前端统一发送 {comment, reasonCodes[]},
|
||||
// 若 @RequestBody 被再度收窄为 Map<String,String>,数组值反序列化失败即 400
|
||||
// (现象:「小程序提交资料后,管理员点通过直接报错」)。
|
||||
// ReviewControllerRequestBodyContractTest
|
||||
// 新增/删减请同步修改本数组(下限随之变化)。
|
||||
const CURATED = [
|
||||
'AuthServiceRefreshTtlTest',
|
||||
@@ -56,6 +60,7 @@ const CURATED = [
|
||||
'PhotoLimitConcurrencyGuardTest',
|
||||
'PhotoUploadValidationTest',
|
||||
'OperatorAuthServiceTest',
|
||||
'ReviewControllerRequestBodyContractTest',
|
||||
]
|
||||
|
||||
const MIN_GUARDS = Number(process.env.BACKEND_GUARDS_MIN ?? CURATED.length)
|
||||
|
||||
Reference in New Issue
Block a user