使用Play Framework 2.3.x,我发现使用Play.data.validation包中的注释与使用validate()
函数编写的自定义代码之间存在差异。
例如,假设我有Circle.java
public class Circle extends Model {
@Constraints.Required
public String name;
public Double radius;
public List<ValidationError> validate() {
List<ValidationError> errors = new ArrayList<ValidationError>();
if(radius == null || radius < 0) {
errors.add(new ValidationError("radius", "Invalid radius"));
}
return errors.isEmpty() ? null : errors;
}
// other stuff...
}
假设我有一个表单,在我的控制器中我使用bindFromRequest()
方法。如果我在表单中两个条目都为空,那么我会在名称字段上得到一个闪烁错误,并显示默认消息error.required
,但在空的半径字段上没有闪烁警告。然后,如果我填写名称字段并尝试再次提交表格,现在它会在半径字段上显示闪烁的错误消息"无效半径"。
我不希望用户必须多次提交表单才能显示不同的验证消息。为什么play不同时执行所有验证检查?可以用这种方式检查验证吗?
正如您所看到的,如果注释中的自定义验证无效,请不要继续播放。如文件所述:
处理表单提交:定义约束
validate
方法在检查基于注释的约束后调用,并且仅当它们通过时调用。
事实上,您的情况很清楚,因为您可以从name
字段中删除Required
注释,并将其移动到您的方法中。
其他方法可以是为radius
编写自定义验证类,并通过注释使用它。