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

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

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

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

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

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

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

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

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

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

validation器

package myvalidators; import javax.validation.*; public class AllUpperCaseValidator extends play.data.validation.Constraints.Validator implements ConstraintValidator { /* 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 alluppercase() { return new AllUpperCaseValidator(); } } 

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

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

注释

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

 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[] payload() default {}; } 

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

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

用法

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

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

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