Hibernate Validationのリファレンスドキュメントでこのセクションの意味を理解するのに助けてくれる人はいますか?Hibernateのバリデーションとバイトコードのエンハンス
バイトコードエンハンスライブラリは、リフレクションを介してフィールドアクセスを判断できないため、エンハンスドオブジェクトのプロパティレベルの制約を使用する必要があります。 [1]
Hibernate Validationのリファレンスドキュメントでこのセクションの意味を理解するのに助けてくれる人はいますか?Hibernateのバリデーションとバイトコードのエンハンス
バイトコードエンハンスライブラリは、リフレクションを介してフィールドアクセスを判断できないため、エンハンスドオブジェクトのプロパティレベルの制約を使用する必要があります。 [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;
}
}
そして、豆の検証が場に出ます。フィールド注釈を使用している場合、フィールドname
は直接反映されてアクセスされ、検証されます。検証は失敗します。
しかし、プロパティ注釈を使用しているときは、フィールド名が有効かどうかを確認するために、name
という方法でgetName()
メソッドにアクセスします。そして検証パス。
もし私が推測しなければならないのは、これは、バイトコードがあなたのオブジェクトを拡張するライブラリを使用しているとします(Springはこれを行う場合もありますが、これもJPAプロバイダがいると仮定します)個々のプライベートフィールドレベルではなく、オブジェクトのゲッターに検証制約注釈を配置する必要があります。 – rmlan