Java JSR303在任何约束冲突时引发异常

Java JSR303在任何约束冲突时引发异常,java,validation,hibernate-validator,Java,Validation,Hibernate Validator,我正在使用Hibernate验证程序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"

我正在使用
Hibernate验证程序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");
这不会引发任何运行时异常,而是创建具有违反约束的对象。为了获得违反的约束,应该从客户机代码显式调用
验证器
实例。我不完全确定他们为什么这样做,但我需要一个对象的构造失败,如果对象的字段被违反,则会出现一些异常。这样的话:

Person p = new Person("a", "b", "c");
。。。将抛出异常。无法创建无效的对象。这是我想要的行为


这可能实现吗?

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

public Person(String name, String surname, String company) {
    if(name == null || name.length() < 3) {
        throw new IllegalArgumentException("useful message")
    }
}
公众人物(字符串名称、字符串姓氏、字符串公司){
if(name==null | | name.length()<3){
抛出新的IllegalArgumentException(“有用消息”)
}
}

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

Hibernate Validator无法神奇地拦截构造函数以执行验证

所以你需要做点什么

您可能可以通过插入类(使用ByteBuddy或类似的工具)来实现所需的功能,但我不确定是否推荐这样做


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

您了解这只是一个试图解释我的需求的基本示例吗?真正的对象有30个字段,使用生成器模式等,所以像您建议的那样是不可能的。正如我所说的,如果违反了约束,我需要构造失败。实例化对象并在服务(或类似内容)中验证它的问题是,我的对象是用builder创建的。唯一的方法是在构建方法中进行验证,这似乎是不对的?当您使用AutoValue.Builder时,实现起来也很棘手(但可能是可能的),您可以尝试使用ByteBuddy来检测类。但我不确定会不会更容易。