在我们的应用程序中,我们有这样一个案例:

  • 约束应按特定顺序进行评估。 (便宜到贵)
  • 在违反每个字段后不应评估约束。
  • 应验证所有字段。

  • 对于前两个,groupsequence 非常适合。但是,对于我的第三个要求,我找不到解决方法。
    public class AccountBean {
    
       @CheepValidation
       @ExpensiveValidation
       @VeryExpensiveValidation
       private String name;
    
       @CheepValidation
       @ExpensiveValidation
       @VeryExpensiveValidation
       private String surname
    }
    

    例如,

    假设,对于姓名字段来说,VeryExpensiveValidationconstraint 被违反,而对于姓氏字段 ExpensiveValidation 约束被违反。

    对于这种情况,我应该显示:

    对于字段名称:只有非常昂贵的验证错误消息
    对于字段姓氏:只有 ExpensiveValidation 错误消息

    请注意,对于字段姓氏,我们没有评估非常昂贵的验证约束。

    有没有办法用 JSR 303 实现它?

    谢谢

    最佳答案

    您可以使用组和@GroupSequence,但它有点笨拙。

    public class AccountBean {
    
       @CheapValidation(groups=Name1.class)
       @ExpensiveValidation(groups=Name2.class)
       @VeryExpensiveValidation(groups=Name3.class)
       String name;
    
       @CheapValidation(groups=Surname1.class)
       @ExpensiveValidation(groups=Surname2.class)
       @VeryExpensiveValidation(groups=Surname3.class)
       String surname;
    
       public interface Name1 {}
       public interface Name2 {}
       public interface Name3 {}
       @GroupSequence({Name1.class, Name2.class, Name3.class})
       public interface Name {}
    
       public interface Surname1 {}
       public interface Surname2 {}
       public interface Surname3 {}
       @GroupSequence({Surname1.class, Surname2.class, Surname3.class})
       public interface Surname {}
    }
    

    然后验证:
    validator.validate(myAccountBean,
        AccountBean.Name.class, AccountBean.Surname.class)
    

    关键是要有两个完全独立的组序列。

    不幸的是,您似乎必须明确列出要验证的所有字段的组。我无法让它与“默认”@GroupSequence 一起工作。任何人都可以改进吗?

    10-08 01:12