0

Kann mir jemand helfen, die Bedeutung dieses Abschnitts in der Hibernate Validation-Referenzdokumentation zu verstehen.Hibernate-Validierung und Bytecode-Erweiterung

Bei der Validierung von Byte-Code-Enhanced-Objects sollten Property-Level-Constraints verwendet werden, da die Bytecode-Enhancing-Library keinen Feldzugriff über Reflektion bestimmen kann. [1]

+0

Wenn ich eine Schätzung abgeben müsste, würde ich sagen, dass dies bedeutet, dass wenn Sie Bibliotheken verwenden, dieser Byte-Code Ihre Objekte verbessert (Spring macht dies in einigen Fällen, aber ich nehme an, dass es JPA-Provider gibt) , sollten Sie Ihre Validierungs-Constraint-Annotationen auf die Getter des Objekts setzen und nicht auf die Ebene einzelner privater Felder. – rmlan

Antwort

1

Eine Bibliothek zur Erweiterung von Bytecodes fügt Ihren geschriebenen Klassen automatisch Code hinzu. Der Enhancer verarbeitet den von Ihrem Java-Compiler generierten Byte-Code nach und fügt Felder oder Methoden hinzu, um ein erforderliches Feature zu implementieren. Die Byte-Code-Erweiterung erfolgt im Allgemeinen während der Build-Zeit oder der Laufzeit. Bibliotheken, die die Byte-Code-Verbesserung verwenden, sind unter anderem Spring, Hibernate 5, openJPA und lombok.

Wenn Sie also eine 'Byte Code Enhancing Library' verwenden, sollten Sie unbedingt Einschränkungen auf Eigenschaftenebene verwenden, da der Hibernate Validator die Reflektion für die Validierung verwendet und ein Reflektionszugriff auf ein Feld den Byte-Code nicht abdeckt verbesserte Eigenschaft.

Zum Beispiel haben Sie die folgende einfache Klasse.

public class Person { 

    @NotNull 
    String name; 

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

Jetzt verwenden Sie oder haben einen Byte-Code-Enhancer implementiert, die die folgende Funktion, um Ihren Code hinzufügen (natürlich während Build oder Laufzeit in Ihrem Byte-Code).

public class Person { 

    @NotNull 
    String name; 

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

Dann kommt die Bean-Validierung ins Spiel. Wenn Sie Feldanmerkungen verwenden, wird das Feld name direkt durch Reflexion aufgerufen und validiert. Die Validierung schlägt fehl.

Wenn Sie jedoch eine Eigenschaftsannotation verwenden, greift die Bean-Validierung auf das Feld name mit der Methode getName() zu, um festzustellen, ob der Feldname gültig ist. Und die Validierung bestanden.