0

任何人都可以帮助我理解 Hibernate Validation 参考文档中本节的含义。

验证字节码增强对象时应使用属性级别约束,因为字节码增强库无法通过反射确定字段访问。[ 1 ]

4

1 回答 1

2

字节码增强库会自动将代码添加到您编写的类中。增强器对 Java 编译器生成的字节码进行后处理,添加字段或方法来实现所需的功能。字节码增强通常发生在构建时或运行时。使用字节码增强的库包括 Spring、Hibernate 5、openJPA 和 lombok。

因此,如果您使用的是“字节码增强库”,那么您绝对应该使用属性级别的约束,因为休眠验证器使用反射进行验证,并且对字段的反射访问(肯定)不会覆盖字节码增强属性。

例如,您有以下简单的类。

public class Person {

    @NotNull
    String name;

    public String getName() {
        return this.name;
    }
}

现在您正在使用或已经实现了一个字节码增强器,它将以下功能添加到您的代码中(当然是在您的字节码的构建或运行时)。

public class Person {

    @NotNull
    String name;

    public String getName() {
        if(this.name == null)
            return "";
        return this.name;
    }
}

然后 bean 验证开始发挥作用。如果您使用字段注释,则该字段name将通过反射直接访问并得到验证。验证失败。

但是当您使用属性注释时,bean 验证将name通过该getName()方法访问该字段以确定字段名称是否有效。并且验证通过。

于 2016-10-07T10:06:06.547 回答