如何在Play Framework 2.0中创建自定义验证器?
2022-09-02 23:38:22
Play 1.0 附带了一个基于 http://oval.sourceforge.net/ 的全功能验证框架。
随着 2.0 的发布,我的自定义验证程序不再工作。
如何使用Play Framework 2.0创建自定义验证器?
Play 1.0 附带了一个基于 http://oval.sourceforge.net/ 的全功能验证框架。
随着 2.0 的发布,我的自定义验证程序不再工作。
如何使用Play Framework 2.0创建自定义验证器?
在 Play 2.0 中,验证框架超越了数据的实际验证,因为它可以达到:
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 验证框架。在这种情况下,验证器需要实现 ConstraintValidator。在我们的例子中,它转换为注释作为类(我们将在一分钟内介绍)和T作为泛型。AllUpperCase
Object
验证器是直接的:
我们定义了公共布尔值 isValid(Object object) 方法,该方法返回一个布尔值,如果为 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 {};
}
请注意注释如何粘附到拼图的其他部分。
@Constraint
,一个 JSR 303 注释,链接到验证器@play.data.Form.Display
中,将注释链接到播放 html 帮助程序。请注意,名称很重要:我们正在定义一个名为alluppercase的约束。Play 使用此信息在验证程序上调用该方法。public static play.data.validation.Constraints.Validator<Object> alluppercase()
我们现在有了自定义验证器和注释
import myvalidators.*;
public static class MyData {
@AllUpperCase
public String name;
}
描述用法不在本文的范围之内,请在此URL上找到一个工作示例