我希望有人可以帮助我理解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();
。我的问题是,何时/何地/如何进行验证?这是正确的,还是我做错了什么?我想我应该要求在构造函数中设置任何非空字段,但如果这是强制执行的方法,那么提供注释的目的是什么呢?
答案 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
对象,然后将请求值映射到其属性,以便强制执行方法在此处不起作用。
此外,通常您可能希望在完全初始化之前使对象处于无效状态,并在对其执行某些实际需要该对象有效的操作之前对其进行验证。