Пружина загрузки 1.3.8 + спящий режим. Двойная инициализация ConstraintValidator на стороне JPA - PullRequest
0 голосов
/ 27 августа 2018

Этот вопрос часто возникает, но я поднялся на новый уровень (как кажется). Копались в этом несколько часов.

Иметь весеннюю загрузку (выпуск 1.3.8) с гибернацией.

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>9</java.version>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.8.RELEASE</version>
    </parent>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

Сформировал ConstraintValidator с бин-инъекциями, которые я связал с сущностью по типу: @Target (ElementType.TYPE)

На стороне контроллера я использовал аннотацию @Valid.

И вот что я получаю (специально помеченное в журналах как isValid): Controller -> @Valid -> Logger сообщает, что isValid вызван (Validator 'this' дает один адрес объекта)

После этого происходит вызов для сохранения объекта: Контроллер -> Сервис -> JPA И с этого момента я вижу, что isValid вызывается снова, натыкаясь на нулевую ссылку на автонастроенный компонент. Регистратор показал, что объект Validator отличается, и показывает другой блок памяти для вывода «this».

Когда я удалил конструктор по умолчанию с помощью конструктора Injection, я увидел более ясную картину: hibernate.newInstance не удалось найти конструктор по умолчанию.

Таким образом, виновником представляется JPA, который пытается создать и проверить сущность в состоянии сохранения, создав отдельный экземпляр валидатора.

И эта вещь связана только тогда, когда я делаю пользовательские проверки для сущностей. Разделил это на entity-dto, с проверками на DTO, и все работает как шарм.

Попробовал предложения из сети, чтобы определить валидаторы и другие вещи, но ничего не помогло.

Может кто-нибудь подсказать, как это сделать без DTO (ненавижу делать дубликаты entity-dto)?


Вот интересная вещь, которую нужно добавить. После нескольких попыток удалось сохранить инъекции bean-компонентов, используя static и autowire конструктора (не могу сказать, что я делал неправильно вчера), и isValid начал проходить. Но теперь я получаю исключение «нулевой идентификатор» для saveAndFlush, вызванное вызовом универсального findPyIpAndIdNot JPA.

Я явно все больше и больше путаюсь с этим, потому что это начинает терять смысл. Перед вызовом я получаю подтверждение, что объект DAO один и тот же, объект - тот же и т. Д., Но в этот момент я ловлю нулевой указатель из ниоткуда.

Попробовал переключиться с JDK 9 на 8. Ничего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...