当前位置: 首页 > 面试题库 >

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

空正豪
2023-03-14
问题内容

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

随着2.0版本的发布,我的自定义验证器不再起作用。

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


问题答案:

在Play 2.0中,验证框架扩展到数据的实际验证范围之外:

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

HTML Helpers是Play
2.0的新html" target="_blank">功能。在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 。在我们的案例中,它将转换为类
的注解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 {};
}

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

  • @ConstraintJSR 303批注链接到验证器
  • @play.data.Form.Display,将注释链接到play html帮助器。请注意,该名称很重要:我们正在定义一个名为 alluppercase*约束 。Play使用此信息来调用Validator上的方法。 *public static play.data.validation.Constraints.Validator<Object> alluppercase()
  • 最后请注意,默认消息是在注释界面中设置的。

用法

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

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

描述用法不在本文讨论范围之内,请在此URL中找到一个有效的示例



 类似资料:
  • 我通过createCustomToken()创建了自定义身份验证令牌,请参见https://firebase.google.com/docs/auth/admin/create-custom-tokens. 但稍后,当我尝试通过verifyIdToken()函数验证此令牌时,它会抛出以下错误 这是合理的,因为没有这样的ID。。。但我需要的是,简单地验证令牌,类似于jwt。验证()。。。 有没有人遇

  • 问题内容: 我有其他人编写的REST api,其中处理请求到特定url的方法接受一堆从路径参数填充的参数。 撰写此文章的人曾经使用过DropWizard,但我以前没有使用它的经验。我的任务是通过将其与db中的值进行比较来验证studentId字段。这将非常简单,但是我被告知要使用自定义验证程序来执行此操作。我对编写注释非常陌生,但经过大量挖掘后,这样编写了注释, 此后,我将注释添加到了要像这样运行

  • 我正在构建一个Spring Boot应用程序,并试图为我将在服务层验证的一些DTO/实体实现自定义验证。基于Spring关于这个问题的文档,我认为一种方法是实现org。springframework。验证。验证程序界面。 作为一个最小、完整、可重复的示例,请考虑以下代码: Spring初始化引导项目 在src/main/java/com中添加了以下代码。实例使用验证: 如果我点击endpoint触

  • 问题内容: 我正在尝试在Log4j2中编写自己的RewritePolicy。该文档指出: RewritePolicy是一个接口,允许实现在将LogEvent传递给Appender之前检查并可能对其进行修改。RewritePolicy声明一个必须执行的名为rewrite的方法。该方法通过LogEvent传递,并且可以返回相同事件或创建一个新事件。 这是我的 java类 : 这是我的 yaml配置 文

  • 问题内容: 我正在http://www.cafeaulait.org/javafaq.html上阅读#6.10项,然后我开始怀疑大型企业如何创建自己的JVM实现。一个人会尝试(或可行)实验性的东西吗? 问题答案: 从技术上讲,创建该新JVM所需的所有信息都是该语言和目标平台的公共规范。即使字节码解释在很大程度上相同,JVM还是需要根据其是要在台式机还是手机上运行而有所不同。 一些开始寻找信息的地方

  • 我正在使用Hibernate@NotNull验证器,我正在尝试创建自定义消息来告诉用户哪个字段在空时产生了错误。类似这样的东西: (这将在我的ValidationMessages.properties文件中)。 其中,{0}应该是通过以下方式传递给验证程序的字段名: 我有办法做到吗?