spring - 使用 Spring 3 验证的两种方法?

标签 spring validation spring-3

我想使用 Spring 3 进行验证。

在引用文档中,第 6.2 节介绍了我们可以为要验证的类实现的 Validator 接口(interface)。它解释了如何创建 Validator 类,但没有解释如何验证对象。

第 6.7 节介绍了 JSR-303 API 及其附带注释的使用。看起来这是一种不同的验证对象的方式(在本例中,使用注释而不创建 Validator 类)。

真的有两种使用 Spring 验证的方法还是我遗漏了一些东西?

一个简单的问题,它还指定 JSR-303 API 的实现必须存在于类路径中。一种建议的实现是 Hibernate-Validator。 Spring是否提供了实现?

谢谢

最佳答案

是的,有两种方法:

  • 验证器接口(interface)是旧的接口(interface),主要用于 spring 2
  • JSR 303 是新的,在构建 spring 2 时它不存在

我建议使用 JSR 303。 - 在我看来,使用旧验证器只有一个原因:那就是如果您需要大量跨字段验证,因为它们相对难以使用 JSR 303 实现(但是这是可能的)

要使用 JSR 303,您需要添加一个验证器实现,例如 Hibernate-Validator(它是 JSR 303 的默认实现)(Hibernate-Validator 不是 Hibernate ORM!,它只是相关的)

这有点像 JPA,有通用的中性规范 (javax.jpa/javax.validation) 和不同的提供程序实现(对于 JPA,例如:EclipseLink 或 Hibernate)

<小时/>

这是一个如何测试验证的示例(测试的目标是测试验证本身,但我将验证器更改为普通验证器),无论如何它应该向您展示如何测试验证器:

public class NotEmptyTest {

    public static class Demo {

        @NotEmpty
        String string;

        public Demo(final String string) {
            this.string = string;
        }
    }

    @Test
    public void testNotEmptysWithValid() {
        /** given: a valid object */
        Demo valid = new Demo("hallo Welt");

        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();

        /** then there must not be any constraint violations */
        AssertUtil.isEmpty(validator.validate(valid));
    }

    @Test
    public void testNotEmptyInValid() {
        /** given: an invalid object */
        Demo valid = new Demo("");

        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();

        /** then there must not be one constraint violation */
        Set<ConstraintViolation<Demo>> result = validator.validate(valid);

        AssertUtil.hasSize(1, result);
        ConstraintViolation<Demo> firstItem = result.iterator().next();
        Assert.assertEquals("{org.hibernate.validator.constraints.NotEmpty.message}",
                firstItem.getMessageTemplate());
    }
}

但是在 Spring MVC Controller 中就容易多了,你只需要在命令对象参数中添加 @Valid ,并在命令对象参数后面直接添加一个 BindingResult 参数即可命令对象参数

@RequestMapping(method = RequestMethod.POST)
public ModelAndView create(@Valid UserCreateCommand userCreateCommand,
         BindingResult bindingResult) {

    if (bindingResult.hasErrors()) {
        //show form again
    } else {
        //create user and 
        //redirect To Show user
    }
}

UserCreateCommand 只是一个 POJO,其中的字段用大量 JSR303 验证约束进行注释。

public class UserCreateCommand {

    @Length(min = 2)
    @NotBlank
    private String login;

    @Email
    @NotNull
    private String emailAddress;

    ....

    //GETTER and SETTER
}

关于spring - 使用 Spring 3 验证的两种方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9993447/

相关文章:

ruby-on-rails - 验证终端命令已在 Rails 中成功运行的最佳方法是什么?

java - 在 spring web 应用程序中创建数据源的正确方法是什么?

c# - 测试所有形式的邮政信箱

java - 从其他集群机器更新本地属性

.net - 使用 CompareValidator 进行时间验证

java - Spring:将@Qualifer 附加到 Java 配置的 bean

java - Spring AOP : Passing parameter in aspect method

spring-webmvc.jar 不随 Spring Framework 3.0.5 下载一起提供

java - 所有 Spring-Boot 应用程序始终显示弹出登录信息

java - 在 Spring 中克隆现有的 ApplicationContext