首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Play Framework2.0中创建自定义验证器?

如何在Play Framework2.0中创建自定义验证器?
EN

Stack Overflow用户
提问于 2011-11-14 06:03:19
回答 1查看 9.9K关注 0票数 17

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

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

如何使用Play Framework2.0创建自定义验证器?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-14 06:04:27

在Play 2.0中,验证框架扩展到数据的实际验证之外,因为它达到:

HTML使用'@‘sign

  • Validators轻松声明验证约束-它实际上实现了validation

  • Messages背后的逻辑-显示参数化的错误消息( compliant)

  • Finally,
  • helpers -它将以前的所有

粘合在一起

HTML帮助器是Play 2.0中的新功能。在1.x中,Play已经很好地执行了定义良好的验证框架。它功能强大,易于使用。然而,我们仍然必须将HTML表单和验证框架连接在一起。这对初学者来说可能有点困惑。

在Play 2.0中,这现在是自动完成的。

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

  • the input is not a String
  • the input is
  • 其中一个字符是小写。

验证器

代码语言:javascript
复制
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验证框架。在这种情况下,验证器需要实现ConstraintValidator.在我们的例子中,它被转换成作为类AllUpperCase的注释(我们将立即介绍)和作为泛型Object的T。

验证器很简单:

我们定义了方法public boolean isValid(Object object),该方法返回一个布尔值,如果为真,则验证通过。还有一个消息id和一个实例化验证器的方法。

注释

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

代码语言:javascript
复制
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,一个JSR303注解,链接到validator
  • @play.data.Form.Display,将注解链接到播放html助手。请注意,名称很重要:我们定义了一个名为alluppercase.的约束Play使用此信息在Validator.
  • Finally上调用public static play.data.validation.Constraints.Validator<Object> alluppercase()方法。注意,默认消息是在另一种接口中设置的。

用法

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

代码语言:javascript
复制
import myvalidators.*;
public static class MyData {
    @AllUpperCase
    public String name;
}

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

票数 41
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8115106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档