JSR 303在任何约束违规时抛出异常

时间:2017-12-20 14:33:50

标签: java validation hibernate-validator

我使用Hibernate Validator API来验证对象上的字段。它的外观如下所示。

@NotNull @Size(min = 3, max = 8) String name;
@NotNull @Size(min = 3, max = 16) String surname;
@Size(min = 3, max = 10) String company;
// ...

现在问题是我能够构造我的对象并且不会抛出任何异常。例如。

Person p = new Person("a", "b", "c");

这不会抛出任何运行时异常,而是创建一个违反约束的对象。并且为了获得违反的约束,应该从客户端代码中明确调用Validator实例。我不完全确定为什么他们这样做,但是如果违反了对象的字段,我需要构造一个失败的对象。那样的话:

Person p = new Person("a", "b", "c");

...会抛出异常。并且无法创建无效对象。这是我想要的行为。

这有可能实现吗?

2 个答案:

答案 0 :(得分:0)

为什么不在创建对象时检查ctor中的值?

public Person(String name, String surname, String company) {
    if(name == null || name.length() < 3) {
        throw new IllegalArgumentException("useful message")
    }
}

但是,我认为这些注释仅在将对象保存到DB时才有效。

答案 1 :(得分:0)

Hibernate Validator不能神奇地拦截你的构造函数来执行验证。

所以你需要做点什么。

您可以通过检测课程(使用ByteBuddy或类似的东西)来达到您想要的效果,但我不确定是否会推荐它。

最简单的方法是创建一个服务或类似的实例化对象,然后对其执行验证。