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
-在这两种情况下,现在将同时评估这两个字段,并且只有在这两个字段都成功的情况下才能进行评估
验证
将被评估。