【问题标题】:Fluent Validation not working on Exception流利的验证不适用于异常
【发布时间】:2017-09-06 08:33:17
【问题描述】:

将 ServiceStack 升级到 4.5.8 后,ServiceStack 会吃掉 Fluent Validation 抛出的异常,并在验证器内部抛出异常时通过验证而不是失败。这似乎只发生在正在运行的验证器使用 SetValidator 方法时。

这将返回新用户,而不是返回错误消息“Validator Exception”。

验证器

public class SaveUserValidator : AbstractValidator<SaveUser>
{
    public SaveUserValidator()
    {
        this.CascadeMode = CascadeMode.StopOnFirstFailure;

        RuleFor(x => x.Id)
            .Must(ThrowException);

        RuleFor(x => x.User)
            .SetValidator(new UserValidator());
    }

    private bool ThrowException(int arg)
    {
        throw new ApplicationException("Validator Exception");
    }
}

用户验证器

public class UserValidator : AbstractValidator<User>
{
    public UserValidator()
    {
        this.CascadeMode = CascadeMode.StopOnFirstFailure;

        RuleFor(x => x.Name).NotEmpty();
    }
}

用户

public class User
{
    public string Name { get; set; }
}

保存用户

public class SaveUser
{
    public int Id { get; set; }

    public User User { get; set; }
}

用户服务

public class UserService : Service
{
    public IHttpResult Post(SaveUser request)
    {
        return new HttpResult(new SaveUser { Id = -100, User = new User { Name = "bad name" } }, HttpStatusCode.Created);
    }
}

【问题讨论】:

    标签: servicestack fluentvalidation


    【解决方案1】:

    ServiceStack 升级为使用 v4.5.8 中的 latest version of FluentValidation,这是发行说明中概述的更改之一,随着 Fluent Validation 的变化,因为以前的版本必须明确指定不应为空的属性,因此您的 UserValidator 应该改为:

    RuleFor(x => x.User)
        .NotEmpty()
        .SetValidator(new UserValidator());
    

    吞下异常的问题是由于 ChildValidatorAdaptor 被异步处理,抛出的异常没有被处理为验证异常,如 Must() 如果属性验证失败,则应该返回 boolean,例如:

    RuleFor(x => x.Id)
        .Must(id => false);
    

    不抛出异常,但我刚刚在this commit 中添加了对处理验证器中抛出的异常的支持。此更改从 v4.5.13 开始可用,现在为 available on MyGet

    【讨论】:

    • 很棒的响应时间!理想情况下,我们将开发不会引发异常的代码,但在极少数(或不那么罕见)的情况下会引发异常,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多