代码之家  ›  专栏  ›  技术社区  ›  Marco Benetti

Java游戏!框架表单验证顺序

  •  0
  • Marco Benetti  · 技术社区  · 7 年前

    开始游戏!框架2.6我已经实现了需要自定义验证的以下表单:

    @Validate
    public class MachineRegistrationForm implements Validatable<List<ValidationError>> {
    
        @Required
        private String field1;
    
        @Required
        private String field2;
    
        // other fields, getters and setters
    
        @Override
        public List<ValidationError> validate() {
    
            // validation on field1 and field2
    
        }
    }
    

    看起来Play会执行我的自定义验证 之前 检查@必填字段 字段1 字段2 实际上包含一些值,迫使我检查这些值是否为null以避免NullPointerException。 我是否遵循了错误的自定义验证方法,或者这是一个游戏!意外行为?

    1 回复  |  直到 7 年前
        1
  •  0
  •   mkurz    7 年前

    TLDR:RTFM;-)

    在您的示例中 validate() 方法在两个 @Required 约束:这三个约束是同时调用的,因此基本上没有保证先运行什么的顺序。这也记录在Play框架中 documentation :

    还要注意,在本例中 validate 方法和 @Constraints.Required 约束将同时调用-因此无论 @约束条件。必需的 是否成功(反之亦然)。稍后您将学习如何引入订单。

    如果你仔细阅读这些文件,你就会找到 "Defining the order of constraint groups" :

    可以按顺序验证组。这意味着将一个接一个地验证组,但只有在之前成功验证了前一个组的情况下,才能验证下一个组。(然而,目前无法确定如何在组内验证约束的顺序……)

    为了让这一点对你有用,让我们为团队加油。。。

    public interface First { }
    

    。。。和

    public interface Second { }
    

    。。。你必须按照以下顺序进行分组:

    import javax.validation.GroupSequence;
    import javax.validation.groups.Default;
    
    @GroupSequence({ Default.class, First.class, Second.class })
    public interface OrderedChecks { }
    

    然后,必须将组添加到约束中:

    @Validate(groups = {Second.class})
    public class MachineRegistrationForm implements Validatable<List<ValidationError>> {
    
        @Required // Default group is Default.class
        private String field1;
    
        @Required(groups = {First.class})
        private String field2;
    
        // other fields, getters and setters
    
        @Override
        public List<ValidationError> validate() {
    
            // validation on field1 and field2
    
        }
    }
    

    现在,您可以按照定义的顺序触发验证:

    Form<MachineRegistrationForm> form = formFactory().form(MachineRegistrationForm.class, OrderedChecks.class).bindFromRequest();
    

    现在 field1 将首先进行检查,并且仅在随后成功时进行检查 field2 将进行检查,并且只有在该操作成功时 验证 将检查方法。您还可以删除 (groups = {First.class}) 从…起 字段2 (因此 Default.class 也默认分组) ,反过来,添加 (组={First.class}) 字段1 -在这两种情况下,现在将同时评估这两个字段,并且只有在这两个字段都成功的情况下才能进行评估 验证 将被评估。