了解Spring的Bean验证

时间:2015-07-10 16:32:12

标签: spring annotations bean-validation

我希望有人可以帮助我理解Spring的Bean验证。首先,如果我有一个带注释的类,

@Entity
public class User {
    @NotNull
    @Column(name = "USERNAME", unique = true, nullable = false)
    private String username;

    public String getUsername()
    {
        return username;
    }

    public void setUsername(String username)
    {
        this.username = username;
    }
}

我仍然可以构造一个无效的对象new User();。我的问题是,何时/何地/如何进行验证?这是正确的,还是我做错了什么?我想我应该要求在构造函数中设置任何非空字段,但如果这是强制执行的方法,那么提供注释的目的是什么呢?

1 个答案:

答案 0 :(得分:1)

您可以创建新的User对象,即使它在创建时无效,因为不会调用验证。您必须手动或使用Spring工具进行验证,才能在给定bean上调用bean验证。例如,在Spring控制器中考虑这种用法:

@RequestMapping(method=POST)
public void save(@RequestBody @Valid User user) {
}

在这种情况下,Spring将在此处理程序方法的POST请求上调用验证,并在验证失败时返回HTTP 400。在内部,这由RequestResponseBodyMethodProcessor处理。

您也可以手动调用给定对象的验证:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<User>> errors = validator.validate(user);

要回答您的问题,您可以强制在构造函数中设置非null值。但是,让我们考虑一下控制器的第一个例子。它不会使用该构造函数,它将使用默认构造函数创建空User对象,然后将请求值映射到其属性,以便强制执行方法在此处不起作用。

此外,通常您可能希望在完全初始化之前使对象处于无效状态,并在对其执行某些实际需要该对象有效的操作之前对其进行验证。