Микронавт - невозможно использовать PersistenceContext - PullRequest
0 голосов
/ 15 октября 2019

Я новичок в микронавтике и стараюсь следовать этому маленькому проекту . Однако я бы хотел, чтобы он работал с postgres.

Мой application.yml выглядит следующим образом:

micronaut:
  application:
    name: hello-world
  datasources:
    default:
      url: 'jdbc:postgresql://localhost:5432/test'
      username: test
      password: test
      driver-class-name: org.postgresql.Driver
  jpa:
    default:
      properties:
        hibernate:
          hbm2ddl:
            auto: update
          show_sql: true

У меня есть доступ к базе данных через intellij. В pom.xml у меня есть следующие зависимости:

       <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.8</version>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>io.micronaut.configuration</groupId>
            <artifactId>micronaut-jdbc-hikari</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>io.micronaut.configuration</groupId>
            <artifactId>micronaut-hibernate-jpa</artifactId>
        </dependency>

Кроме того, в ссылке упоминается, что нужно annotionProcessor, поэтому я добавил это в свой профиль сборки:

<annotationProcessorPaths>
    <path>
        <groupId>javax.persistence</groupId>
        <artifactId>javax.persistence-api</artifactId>
        <version>2.2</version>
    </path>
</annotationProcessorPaths>

Так что теперь каждый раз, когда я пытаюсь сделать следующее:

@PersistenceContext
private EntityManager entityManager;

Я получаю следующую ошибку:

Caused by: io.micronaut.context.exceptions.NoSuchBeanException: No bean of type [javax.persistence.EntityManager] exists. Make sure the bean is not disabled by bean requirements (enable trace logging for 'io.micronaut.context.condition' to check) and if the bean is enabled then ensure the class is declared a bean and annotation processing is enabled (for Java and Kotlin the 'micronaut-inject-java' dependency should be configured as an annotation processor).

Однако у меня уже включен annotation processing. И у меня также есть @Entity -класс:

@Entity
@Table(name = "users")
public class User {

    @NotBlank
    @Column(name = "name")
    private String userName;


    public User() {
    }


    public User(@NotBlank final String userName) {
        this.userName = userName;
    }


    public String getUserName() {
        return userName;
    }


    public void setUserName(final String userName) {
        this.userName = userName;
    }
}

Что именно мне не хватает в моей настройке?

1 Ответ

0 голосов
/ 15 октября 2019

Было несколько проблем с моей настройкой.

  1. datasource и jpa должны быть на корневом уровне
  2. @Entity требуется @Id

Итак, в итоге application.yml выглядит так:

micronaut:
  application:
    name: hello-world
datasources:
  default:
    url: 'jdbc:postgresql://localhost:5432/test'
    username: test
    password: test
    driver-class-name: org.postgresql.Driver
jpa:
  default:
    packages-to-scan:
      - 'test'
    properties:
      hibernate:
        hbm2ddl:
          auto: update
        show_sql: true

А классу @Entity необходим атрибут @Id:

@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;


    @NotBlank
    @Column(name = "user_name")
    private String userName;


    public User() {
    }


    public User(@NotBlank final String userName) {
        this.userName = userName;
    }


    public String getUserName() {
        return userName;
    }


    public void setUserName(final String userName) {
        this.userName = userName;
    }


    @Override
    public String toString() {
        return "User{" +
                "userName='" + userName + '\'' +
                '}';
    }
}
...