繁体   English   中英

如何在Play Framework 2.0中创建自定义验证器?

[英]How to create a custom validator in Play Framework 2.0?

Play 1.0附带了一个基于http://oval.sourceforge.net/的全功能验证框架。

随着2.0的发布,我的自定义验证器不再起作用了。

如何使用Play Framework 2.0创建自定义验证器?

在Play 2.0中,验证框架超出了数据的实际验证范围,因为它达到:

  • 注释 - 使用“@”符号轻松声明验证限制
  • 验证器 - 实际上实现验证后面的逻辑
  • 消息 - 显示参数化错误消息(符合i18)
  • 最后,HTML助手 - 将前面的所有内容粘合在一起

HTML助手是Play 2.0的新功能。 在1.x中,Play已经非常擅长强制执行一个定义良好的验证框架。 它功能强大且易于使用。 然而,我们仍然需要将HTML表单和验证框架连接在一起。 这对初学者来说可能有点混乱。

使用Play 2.0,现在可以自动完成。

但是让我们专注于答案并提供一些指导:我们将创建一个AllUpperCase验证器,在以下情况下生成错误:

  • 输入不是String
  • 输入为空
  • 其中一个字符是小写的。

验证器

package myvalidators;

import javax.validation.*;

public class AllUpperCaseValidator 
        extends play.data.validation.Constraints.Validator<Object> 
        implements ConstraintValidator<AllUpperCase, Object> {

    /* Default error message */
    final static public String message = "error.alluppercase";

    /**
     * Validator init
     * Can be used to initialize the validation based on parameters
     * passed to the annotation.
     */
    public void initialize(AllUpperCase constraintAnnotation) {}

    /**
     * The validation itself
     */
    public boolean isValid(Object object) {
        if(object == null)
            return false;

        if(!(object instanceof String))
            return false;

        String s = object.toString();  
        for(char c : s.toCharArray()) {
            if(Character.isLetter(c) && Character.isLowerCase(c))
                return false;
        }

        return true;
    }

    /**
     * Constructs a validator instance.
     */
    public static play.data.validation.Constraints.Validator<Object> alluppercase() {
        return new AllUpperCaseValidator();
    }
}

您可能会注意到的第一件事是导入:Play 2.0确实符合JSR 303 - Bean Validation Framework。 在此上下文中,验证器需要实现ConstraintValidator 在我们的例子中,将注释转换为类AllUpperCase (我们将在一分钟内介绍)和T作为通用Object

验证器是直截了当的:
我们定义了方法public boolean isValid(Object object)返回一个boolean,如果为true则验证通过。 还有一个消息ID和一个实例化验证器的方法。

注释

下面的类定义了一个名为@AllUpperCase的注释,该注释不带参数,但强制执行先前定义的验证。 提供与注释框架相关的详细信息超出了本文的范围。

package myvalidators;

import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;

import javax.validation.*;

@Target({FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = AllUpperCaseValidator.class)
@play.data.Form.Display(name="constraint.alluppercase")
public @interface AllUpperCase {
    String message() default AllUpperCaseValidator.message;
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

注意anotation如何粘合到拼图的其他部分。

  • @Constraint ,一个JSR 303注释,链接到验证器
  • @play.data.Form.Display ,将注释链接到play html helpers。 请注意,名称很重要:我们正在定义名为alluppercase约束 Play使用此信息在Validator上调用方法public static play.data.validation.Constraints.Validator<Object> alluppercase()
  • 最后请注意,默认消息是在anotation界面中设置的。

用法

我们现在有自定义验证器和注释

import myvalidators.*;
public static class MyData {
    @AllUpperCase
    public String name;
}

描述用法超出了本文的范围,请在此URL上找到工作示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM