」校验问题复盘)
导入「参数/规则(JSON)」校验问题复盘一、问题现象用户在 Excel 模板Sheet 2提示词规则的「参数/规则(JSON)」列中填写了非法 JSON例如{id:is_recanalization}}科室多一个}且尾部有非 JSON 文字。导入时未报错表现像「导入成功」。用户期望此类内容应被校验拦截并提示错误。二、原因分析2.1 Jackson 默认行为使用ObjectMapper.readTree(String)解析时Jackson默认允许在解析完一个合法 JSON 值之后后面还有多余字符trailing tokens。对字符串{id:is_recanalization}}科室解析器先成功解析出{id:is_recanalization}即得到一个合法JsonNode。后面的}}科室被当作「尾部多余字符」默认不报错readTree()正常返回不抛异常。因此原有逻辑中「非法 JSON 应进 catch」的预期不成立只有完全无法解析时才会抛异常尾部脏数据不会触发。2.2 列是否对上经核对代码中getDataCell(row, 1, offset)与模板Sheet 2的列顺序一致列 1 即为「参数/规则(JSON)」列未错位。若曾出现「改 Excel 仍能导入」的情况多为上述默认解析行为导致而非读错列。2.3 失败后流程未中断已存在设计Sheet 2 校验失败时仅result.addError(...)并return出importSheet2PromptRules主流程未在 Sheet 2 之后做「有错误即中止」判断。因此即使将来校验抛错并写入result若不在主流程中统一「有错即 return result」仍会继续执行后续 Sheet表现为「部分成功」。本次修改仅加强 JSON 校验流程中断策略可另行统一改进。三、解决方案3.1 强校验禁止尾部多余字符使用 Jackson 的DeserializationFeature.FAIL_ON_TRAILING_TOKENS在「参数/规则(JSON)」校验时启用。效果整段字符串必须恰好是一个合法 JSON解析完后不允许再有任何字符如}}科室会触发异常进入 catch并写入result.addError(...)。3.2 代码改动摘要位置ConfigImportServiceImplSheet 2 提示词规则导入中的「参数/规则(JSON)」校验。新增静态ObjectMapper实例STRICT_JSON_MAPPER仅用于此处强校验privatestaticfinalObjectMapperSTRICT_JSON_MAPPERnewObjectMapper().enable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS);校验处将原来的OBJECT_MAPPER.readTree(paramContent.trim())改为STRICT_JSON_MAPPER.readTree(paramContent.trim())。依赖已有jackson-databind仅增加对DeserializationFeature的 import。3.3 校验策略说明非空才校验该列为空时不做 JSON 校验与原有逻辑一致。仅此处使用 STRICT_JSON_MAPPER其它地方仍使用OBJECT_MAPPER避免影响现有反序列化行为。四、验证建议在 Sheet 2「参数/规则(JSON)」列填写{id:is_recanalization}}或{id:x}}科室执行导入应报错并提示「参数/规则不符合 JSON 语法」。填写合法 JSON如{id:is_recanalization}导入应通过其它条件不变前提下。五、经验与后续可做JSON 校验若业务要求「整段单元格即一个 JSON、不得带尾部垃圾」应显式开启FAIL_ON_TRAILING_TOKENS或等价策略不能依赖默认的「解析到第一个值即成功」行为。导入流程建议在主流程中在每个 Sheet 导入后统一判断result.getErrors()若有错误则立即return result避免部分失败后仍继续执行后续 Sheet便于用户得到清晰的一次性错误反馈。文档已在配置导入模板说明.md中说明「参数/规则(JSON) 非空时校验 JSON 语法」可补充一句不允许 JSON 后带多余字符强校验。文档生成时间与本次代码修改同步。