任何人都可以帮助我理解 Hibernate Validation 参考文档中本节的含义。
验证字节码增强对象时应使用属性级别约束,因为字节码增强库无法通过反射确定字段访问。[ 1 ]
任何人都可以帮助我理解 Hibernate Validation 参考文档中本节的含义。
验证字节码增强对象时应使用属性级别约束,因为字节码增强库无法通过反射确定字段访问。[ 1 ]
字节码增强库会自动将代码添加到您编写的类中。增强器对 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()
方法访问该字段以确定字段名称是否有效。并且验证通过。