Spring Boot 2. Проблема с дублированием аннотации при использовании hibernate-jpamodelgen - PullRequest
0 голосов
/ 17 мая 2018

У меня есть простое приложение Spring Boot 2, использующее hibernate-jpamodelgen.Вот весь POM Maven:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>

      <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.2.RELEASE</version>
      </parent>

      <groupId>gov.idaho.isp</groupId>
      <artifactId>SpringBootJpaModelGenIssue</artifactId>
      <version>0.1</version>  
      <packaging>jar</packaging>

      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <tomcat.version>9.0.5</tomcat.version>
        <java.version>1.8</java.version>
      </properties>

      <dependencies>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-devtools</artifactId>
          <optional>true</optional>
        </dependency>

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

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

        <dependency>
          <groupId>com.h2database</groupId>
          <artifactId>h2</artifactId>
        </dependency>

        <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-jpamodelgen</artifactId>
        </dependency>
      </dependencies>

    </project>

Приложение содержит одну простую сущность, виджет с аннотацией ограничения проверки bean-компонента @NotNull:

    import java.io.Serializable;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.validation.constraints.NotNull;

    @Entity
    public class Widget implements Serializable {
      @Id @GeneratedValue
      private Long id;

      @NotNull
      private String name;
      ...
    }

При запуске этого приложения Spring Bootи затем внесение изменений в эту сущность, приложение не может успешно перезапуститься из-за ошибки:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.cfg.beanvalidation.IntegrationException: Error activating Bean Validation integration

с окончательной основной причиной:

Caused by: java.lang.annotation.AnnotationFormatError: Duplicate annotation for class: interface javax.validation.constraints.NotNull: @javax.validation.constraints.NotNull(message={javax.validation.constraints.NotNull.message}, groups=[], payload=[])

Эта ошибка перезапуска исчезает, еслиhibernate-jpamodelgen зависимость удалена.Это известная проблема?

См. Пример приложения по адресу https://github.com/BriceRoncace/SpringBootJpaModelGenIssue, чтобы воссоздать проблему.(Я столкнулся с этой проблемой в Spring Boot 2.0.0 и 2.0.2.)

1 Ответ

0 голосов
/ 18 мая 2018

Обходной путь - использовать maven-processor-plugin, чтобы явно указать, что org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor должен выполняться, и переместить зависимость hibernate-jpamodelgen в определение плагина:

<plugin>
  <groupId>org.bsc.maven</groupId>
  <artifactId>maven-processor-plugin</artifactId>
  <version>3.3.3</version>
  <executions>
    <execution>
      <id>process</id>
      <goals>
        <goal>process</goal>
      </goals>
      <phase>generate-sources</phase>
      <configuration>
        <processors>                                
          <processor>org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</processor>
        </processors>
      </configuration>
    </execution>
  </executions>
  <dependencies>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-jpamodelgen</artifactId>
      <version>5.2.17.Final</version>
    </dependency>
  </dependencies>
</plugin>

Документы метамодели hibernate указывают, что вы должны отключить обработку аннотаций для плагина компилятора:

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <compilerArgument>-proc:none</compilerArgument>
  </configuration>
</plugin>

Однако я обнаружил, что указанные выше ошибки весеннего перезапуска исчезают, даже если не отключать обработку аннотаций компилятора.

См коммит https://github.com/BriceRoncace/SpringBootJpaModelGenIssue/commit/033ba0078b519d188e7d4c0e6ec66f4278d50ab1

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