FluentValidation升级11后首个验证失败即停止执行问题
问题根因
这是FluentValidation 11版本的破坏性变更导致的,和你的验证逻辑、单元测试写法无关:
- 10及更早版本默认类级联模式是
CascadeMode.Continue,会跑完所有配置的验证规则,收集全部失败结果再返回 - 11版本开始默认类级联模式改成了
CascadeMode.Stop,同层级规则只要碰到第一个验证失败项,就会直接终止后续所有规则执行,这就是你调整规则编写顺序、返回的错误项也跟着变的核心原因。
你代码里已经把配置类级联模式的代码ClassLevelCascadeMode = CascadeMode.Continue;注释掉了,自然就用了11版本的默认Stop逻辑,不会返回全部错误。
修复方法
直接把你注释掉的类级联模式配置放开即可,显式指定需要执行完所有规则:
public sealed class Validator : AbstractValidator<Command> { public Validator() { // 显式配置类级别级联模式为继续执行所有规则 ClassLevelCascadeMode = CascadeMode.Continue; RuleFor(x => x.Id).ValidateId(); RuleFor(x => x.Name).ValidateAccountName(); RuleFor(x => x.Description).ValidateAccountDescription(); RuleFor(x => x.Status).ValidateAccountStatus(); When( x => !(x.prop1 is null) || !(x.prop2 is null) || !(x.prop3 is null), () => { RuleFor(x => x.prop1Enum).NotNull().IsInEnum(); RuleFor(x => x.prop2Number).ValidateNumber(); RuleFor(x => x.prop3Number).ValidateNumber(); } ); } }
额外注意事项
如果改完配置还有规则不执行,逐一排查下面几个点:
- 检查你自定义的
ValidateId、ValidateAccountName、ValidateNumber这类扩展验证方法内部,有没有单独给对应规则配置CascadeMode.Stop,规则级别的级联配置优先级高于类级别配置 - 检查项目启动时的FluentValidation全局配置,有没有在依赖注入注册时写过全局默认级联模式为Stop的代码,验证器内部的显式配置会覆盖全局配置,但如果没写验证器内的配置就会受全局配置影响
- 你贴的示例代码里有几处笔误,比如
x.prop1is null少了空格、x.prop 3 is null多了空格、excludeprop3大小写不对,实际编译运行前要修正,不然会直接报编译错误。
另外你单元测试里的断言result.Errors.Should().HaveCountLessOrEqualTo(3);逻辑和预期不符,你要验证的是缺几个字段返回几个对应错误,应该断言错误数等于当前测试用例排除的字段数量,而不是小于等于3,不过这个问题不会导致你现在碰到的只返回第一个错误的现象。
内容的提问来源于stack exchange,提问作者JesseNicholsonStorable
相关产品推荐
相关产品推荐

