调用invalidDestination.clear()清空列表后仍显示历史错误如何解决
问题原因
- 核心原因:全局错误存储集合未清空
你代码中定义的validationErrors是类级别的成员可变集合,所有校验产生的错误都会追加存入这个集合,你仅清空了单次校验使用的局部列表invalidDestination,从未清空过validationErrors,所以每次返回的错误都会携带历史记录。 - 逻辑缩进问题
你当前的if判断未添加花括号,导致invalidDestination.clear()不属于if分支的执行范围,不管是否触发错误都会执行,不过该问题不是你当前报错的核心诱因。 - 潜在代码缺陷
校验方法入参为configTypeBuilderList列表,但代码中直接使用了未遍历的configTypeBuilder变量,没有循环处理列表中的所有元素,可能导致后续校验结果不符合预期;另外方法名validateConfigTypeBduilder存在拼写错误,建议修正为validateConfigTypeBuilder降低后续维护成本。
修复方案
推荐直接在校验方法入口添加历史错误清空逻辑即可解决你的问题,参考修改后的代码:
private val validationErrors = mutableSetOf<ValidationError>() private fun validateConfigTypeBuilder(configTypeBuilderList: List<ConfigTypeBuilder>, ruleAttributes: List<String>, destinationFieldList: List<String>) { validationErrors.clear() // 新增:每次校验前清空历史错误 if (ruleAttributes.isNotEmpty()) { val invalidDestination = mutableListOf<String>() for (destinationField in destinationFieldList) { if (!ruleAttributes.contains(destinationField)) { invalidDestination.add(destinationField) } } // 补充if分支花括号避免逻辑歧义,原firstOrNull判断可简化为contains if (invalidDestination.contains(configTypeBuilder.destinationField)) { addValidationError("someMessage", "someMessage", "$ADD_FIELDS $invalidDestination") } // 无需手动clear invalidDestination,作为方法局部变量会在方法执行结束后自动回收 } } private fun addValidationError(fieldPath: String, field: Any, error: String) { logDataPathValidationError(fieldPath, field, error) validationErrors.add( ValidationError( fieldPath, error ) ) } internal fun logDataPathValidationError(dataPath: String, value: Any?, constraint: String) { logger.info("{} {} value violates {} constraint", dataPath, value, constraint) }
如果你的业务是多线程并发校验场景,不建议用成员变量存储校验错误,可以改为将校验错误集合作为方法返回值返回,避免多线程数据互相干扰。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

