如何在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
您可能会注意到的第一件事是导入: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 extends Payload>[] payload() default {}; }
注意anotation如何胶合到拼图的其他部分。
-
@Constraint
,一个JSR 303注释,链接到validation器 -
@play.data.Form.Display
,将注释链接到play html helpers。 请注意,名称很重要:我们正在定义名为alluppercase的约束 。 Play使用此信息在Validator上调用方法public static play.data.validation.Constraints.Validator
。alluppercase() - 最后请注意,默认消息是在anotation界面中设置的。
用法
我们现在有自定义validation器和注释
import myvalidators.*; public static class MyData { @AllUpperCase public String name; }
描述用法超出了本文的范围,请在此URL上找到工作示例