【问题标题】:understanding Spring's Bean validation了解 Spring 的 Bean 验证
【发布时间】:2015-07-10 16:32:11
【问题描述】:

我希望有人能帮助我理解 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();。我的问题是,何时/何地/如何进行验证?这是正确的,还是我做错了什么?我想我应该要求在构造函数中设置任何非空字段,但是如果这是强制执行的方法,那么还提供注释的目的是什么?

【问题讨论】:

    标签: spring annotations bean-validation


    【解决方案1】:

    您可以创建一个新的User 对象,即使它在创建时无效,因为不会调用验证。您必须手动调用给定 bean 上的 bean 验证或使用 Spring 工具进行验证。例如考虑 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 对象,然后将请求值映射到它的属性,所以这种执行方法在这里不起作用。

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

    【讨论】:

    • 这是有道理的。因此,spring 将在 Controller 和 persist() 上进行验证 - 还有其他时间/方式来检查验证吗?我尝试将@Valid 放在DAO 保存方法中(例如),但没有触发验证。
    • 在阅读更多内容时,看起来 Spring 只会验证控制器。我需要实现一个自定义注释来让服务按照我想要的方式运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    相关资源
    最近更新 更多