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 并通过注释使用它。