Этот вопрос часто возникает, но я поднялся на новый уровень (как кажется).
Копались в этом несколько часов.
Иметь весеннюю загрузку (выпуск 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. Ничего.