0

Hibernate Validationのリファレンスドキュメントでこのセクションの意味を理解するのに助けてくれる人はいますか?Hibernateのバリデーションとバイトコードのエンハンス

バイトコードエンハンスライブラリは、リフレクションを介してフィールドアクセスを判断できないため、エンハンスドオブジェクトのプロパティレベルの制約を使用する必要があります。 [1]

+0

もし私が推測しなければならないのは、これは、バイトコードがあなたのオブジェクトを拡張するライブラリを使用しているとします(Springはこれを行う場合もありますが、これもJPAプロバイダがいると仮定します)個々のプライベートフィールドレベルではなく、オブジェクトのゲッターに検証制約注釈を配置する必要があります。 – rmlan

答えて

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()メソッドにアクセスします。そして検証パス。

関連する問題