【问题标题】:How to create a custom validator in Play Framework 2.0?如何在 Play Framework 2.0 中创建自定义验证器?
【发布时间】:2011-11-13 22:03:19
【问题描述】:

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

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

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

【问题讨论】:

    标签: java playframework-2.0


    【解决方案1】:

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

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

    HTML Helpers 是 Play 2.0 的新功能。在 1.x 中,Play 已经非常擅长执行定义良好的验证框架。它功能强大且易于使用。然而,我们仍然必须将 HTML 表单和验证框架连接在一起。这可能会让初学者有点困惑。

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

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

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

    验证器

    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),如果为真则验证通过。还有一个消息 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 {};
    }
    

    注意注释如何与拼图的其他部分粘合。

    • @Constraint,一个 JSR 303 注释,链接到验证器
    • @play.data.Form.Display,将注解链接到播放 html 助手。请注意,名称很重要:我们定义了一个名为 alluppercaseconstraint。 Play 使用此信息调用验证器上的方法 public static play.data.validation.Constraints.Validator&lt;Object&gt; alluppercase()
    • 最后请注意,默认消息是在注释界面中设置的。

    用法

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-04-29
      • 2013-01-28
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      相关资源
      最近更新 更多