2015-07-10 54 views
0

我希望有人能够帮助我理解Spring的Bean验证。首先,如果我有一个注解类,了解Spring's 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

您可以创建一个新的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); 

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

而且,通常你可能想在无效状态的对象之前,它是完全初始化和验证它,你用它做的东西,实际上是希望对象是有效的了。

+0

这很有道理。所以,Spring将在Controller中和persist()上验证 - 是否有另一种时间/方法来验证验证?我尝试在DAO保存方法中放入'@ Valid',但没有触发验证。 –

+0

在做更多的阅读时,它看起来像Spring只会验证控制器。我需要实现一个自定义注释以使服务按照我喜欢的方式行事。 –