Play Framework - play.data.validations 与自定义验证?
Play Framework - play.data.validations vs. custom validations?
使用 Play Framework 2.3.x,我发现在 play.data.validation package 中使用注释和在 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
,但在空半径字段上没有闪光警告。然后,如果我填写名称字段并尝试再次提交表单,现在它会在半径字段上显示闪烁的错误消息 "Invalid radius"。
我不希望用户必须多次提交表单才能显示不同的验证消息。为什么 play 不同时执行所有验证检查?是否可以通过这种方式检查验证?
如您所见,如果注释中的这些无效,Play 不会继续自定义验证。如文档中所述:
Handling form submission: Defining constraints
validate
method is called after checking annotation-based constraints and only if they pass.
实际上你的情况很清楚,因为你可以从 name
字段中删除 Required
注释并将其移动到你的方法中。
其他方法可以是为 radius
编写自定义验证 class 并通过注释使用它。
使用 Play Framework 2.3.x,我发现在 play.data.validation package 中使用注释和在 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
,但在空半径字段上没有闪光警告。然后,如果我填写名称字段并尝试再次提交表单,现在它会在半径字段上显示闪烁的错误消息 "Invalid radius"。
我不希望用户必须多次提交表单才能显示不同的验证消息。为什么 play 不同时执行所有验证检查?是否可以通过这种方式检查验证?
如您所见,如果注释中的这些无效,Play 不会继续自定义验证。如文档中所述:
Handling form submission: Defining constraints
validate
method is called after checking annotation-based constraints and only if they pass.
实际上你的情况很清楚,因为你可以从 name
字段中删除 Required
注释并将其移动到你的方法中。
其他方法可以是为 radius
编写自定义验证 class 并通过注释使用它。