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.
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