Hibernate验证和字节码增强

时间:2016-10-05 17:16:20

标签: java hibernate hibernate-validator byte-code-enhancement

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

  

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

1 个答案:

答案 0 :(得分:1)

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

因此,如果你使用'字节码增强库'那么你肯定应该使用属性级别约束,因为hibernate验证器使用反射进行验证,并且字段上的反射访问不会(肯定)覆盖增强的字节代码属性。

例如,您有以下简单类。

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(),以确定字段名称是否有效。验证通过。