2017-09-05 73 views
3

將ServiceStack升級到4.5.8後,ServiceStack會吃掉由Fluent驗證引發的異常,並在驗證程序中引發異常時通過驗證而不是失敗。這似乎只在運行驗證程序使用SetValidator方法時纔會發生。流利的驗證不起作用異常

這將返回新用戶而不是返回錯誤消息「驗證器異常」。

驗證

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"); 
    } 
} 

UserValidator

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

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

用戶

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

SaveUser

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

    public User User { get; set; } 
} 

UserService

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

回答

1

ServiceStack升級到使用v4.5.8的latest version of FluentValidation,一箇中,由於previus版本流利的驗證改變了發行說明中概述的變化是有明確規定,不能爲空的屬性,所以你應該UserValidator改變:

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

與吞嚥異常的問題是由於ChildValidatorAdaptor正在取得異步和拋出的異常,像Must()都應該返回boolean如果日不爲驗證異常處理Ë屬性驗證失敗,e.g:

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

不會拋出異常,但我只是添加了用於處理this commit驗證器拋出的異常的支持。此更改可從v4.5.13(現在爲available on MyGet)獲得。

+0

真棒響應時間!理想情況下,我們將開發不會拋出異常的代碼,但在罕見(或不是很罕見)的機會下,謝謝! –