Проверка гибернации и улучшение байтового кода

#java #hibernate #hibernate-validator #byte-code-enhancement

#java #гибернация #гибернация-валидатор #улучшение байтового кода

Вопрос:

Может ли кто-нибудь помочь мне понять значение этого раздела в справочной документации по проверке гибернации.

При проверке объектов с улучшенным байтовым кодом следует использовать ограничения на уровне свойств, поскольку библиотека, улучшающая байтовый код, не сможет определить доступ к полю через отражение. [1]

Комментарии:

1. Если бы мне пришлось высказать предположение, я бы сказал, что это означает, что если вы используете библиотеки, которые улучшают байтовый код ваших объектов (Spring делает это в некоторых случаях, но я предполагаю, что есть поставщики JPA, которые также делают это), вам следует разместить аннотации ограничения проверки на получателях объекта, а не на уровне отдельного частного поля.

Ответ №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;
    }
}
  

Затем вступает в игру проверка компонента. Если вы используете аннотацию поля name , к полю напрямую обращается отражение и проверяется. Проверка завершается с ошибкой.

Но когда вы используете аннотацию свойства, проверка компонента получит доступ к файлу name getName() , поданному методом, чтобы определить, является ли имя поля допустимым. И проверка проходит.