当前位置: 首页 > 知识库问答 >
问题:

如何在Kotlin使用单独的配置文件/环境数据源进行Micronaut测试?

杜楚
2023-03-14

我试图为我用Kotlin编写的Micronaut web应用程序使用两个数据源:一个是mysql数据库,另一个是执行测试时使用的内存H2数据库。

我尝试过只使用h2数据库作为默认的生产数据源,所以关于它的配置字段应该是正确的。

应用程序通过执行在mysql数据源中按预期运行。/gradlew run

  1. 我尝试将数据源放在单独的配置文件中,application。yml应用测试。yml位于src/main/resources/目录中,并且只放置应用程序测试。yml在src/test/resources/中,没有结果
  2. 添加@MicronautTest注释,声明那里的test环境和application=bookiesparaserverapplication参数无效
  3. @TypeHint(Genre::class,Book::class,DefaultGenreRepository::class)注释添加到BookieServerApplication中无效

这些是src/main/resources/application的相关字段。yml配置文件

datasources:
  default:
    url: 'jdbc:mysql://localhost:3306/bookie-server?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&useSSL=false'
    dbCreate: create-update
    driverClassName: com.mysql.cj.jdbc.Driver
    dialect: org.hibernate.dialect.MySQL5InnoDBDialect
    username: root
    password: root

jpa:
  default:
    entity-scan:
      packages:
        - 'com.transgressoft.bookieserver.domain'
    properties:
      hibernate:
        hbm2ddl:
          auto: update
        show_sql: true

这是src/test/resources/application测试。yml文件:

datasources:
  default:
    url: ${JDBC_URL:`jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE`}
    username: ${JDBC_USER:sa}
    password: ${JDBC_PASSWORD:""}
    driverClassName: ${JDBC_DRIVER:org.h2.Driver}

jpa:
  default:
    entity-scan:
      packages:
        - 'com.transgressoft.bookieserver.domain'
    properties:
      hibernate:
        hbm2ddl:
          auto: update
        show_sql: true

当我执行测试时(GenreControllerSpec在代码中),看起来像是没有创建EntityManagerbean,因此无法实例化DAO类(在我的代码中是GenreRepository类)。

这是完整的日志消息:

Internal Server Error: Failed to inject value for parameter [entityManager] of class: com.transgressoft.bookieserver.domain.$DefaultGenreRepositoryDefinition$Intercepted

Message: 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).
Path Taken: new $GenreControllerDefinition$Intercepted([GenreRepository genreRepository],BeanContext beanContext,Interceptor[] interceptors) --> new $DefaultGenreRepositoryDefinition$Intercepted([EntityManager entityManager],ConfigurationProperties applicationConfiguration,BeanContext beanContext,Interceptor[] interceptors)
io.micronaut.http.client.exceptions.HttpClientResponseException: Internal Server Error: Failed to inject value for parameter [entityManager] of class: com.transgressoft.bookieserver.domain.$DefaultGenreRepositoryDefinition$Intercepted

完整的项目代码可在此访问https://github.com/octaviospain/bookie-server/tree/feature/jpa-and-hibernate要复制上述日志,只需执行/gradlew test并打开报告,或在激活日志的情况下运行报告。

编辑:我已经用伊万·洛佩兹的建议更新了描述,但是错误和预期结果保持不变。


共有2个答案

虞博涛
2023-03-14
匿名用户

您的示例应用程序使用的是micronaut-hibernate-jpa的1.1.1,它不支持

jpa:
  default:
    entity-scan:
      packages:
        - 'com.transgressoft.bookieserver.domain'

必须使用jpa.default.packages扫描作为留档状态。

易飞文
2023-03-14

我认为您误解了定义数据源的工作原理。设置时:

datasources:
  production:
    ...

  test:
    ...

jpa:
  production:
    ...

  test:
    ...

您正在告诉Micronaut:我希望您同时创建两个数据源,一个名为生产,另一个名为测试。这两个数据源对应用程序都是可用的,您可以使用定义的名称(生产测试)和限定符注入它们。

您需要做的是在src/main/resources/application中定义。yml只有一个数据源。Micronaut使用默认值名称作为默认值:

datasources:
  default:
    ... // your production MySQL database 

jpa:
  default:
    ... // configuration for MySQL database

然后,您可以覆盖应用程序中定义的任何内容。yml只是创建src/test/resources/application test。yml,内容如下:

datasources:
  default:
    ... // your test H2 database 

jpa:
  default:
    ... // configuration for H2 database

希望它有意义。你可以在这里找到更多信息:https://docs.micronaut.io/latest/guide/index.html#config

 类似资料:
  • 问题内容: 我有两个.env文件,例如和。我正在使用typeorm作为我的数据库ORM。我想知道每当我运行应用程序时如何让typeorm读取其中一个配置文件。来自typeormmodule。 问题答案: 您可以创建一个ConfigService来读取与环境变量相对应的文件: 1)在您的启动脚本中设置变量: 2)在ConfigService中读取相应的.env文件 3)使用来建立您的数据库连接:

  • 我是 Kafka 的新手,我写了一段写入主题的代码(制作人)。 现在,我被赋予了一项任务,即观察内容是否与主题相关。 我的技术主管提供的唯一信息是我应该安装kafka连接,并使用此XML: 我完全不知道在哪里或如何导入这个xml配置文件。我安装了kafka,将其放到本地运行,但所有配置文件通常采用以下格式: 部分输出: 我尝试在这里添加字段,但缺少许多字段,任何提示都将非常受欢迎,我做了一些研究,

  • Heroku在日志中标识它正在尝试访问一个我没有使用的MongoDB碎片(但使用过一次)。错误消息显示: “无法连接到服务器[Swarmage-Shard-00-00-ekq8j.gcp.MongoDB.net:27017]” 但我不知道它为什么要连接那个服务器。 我正在将应用程序部署到。Heroku链接到我的数据库。我可以通过mongo shell与数据库交互。当我在本地服务器上运行时,post

  • 本文向大家介绍Spring Boot使用profile如何配置不同环境的配置文件,包括了Spring Boot使用profile如何配置不同环境的配置文件的使用技巧和注意事项,需要的朋友参考一下 在springboot的开发中,有时候我们会有不同的配置,例如日志打印,数据库连接等,开发,测试,生产每个环境可能配置都不一致,还好,springboot支持通过不同的profile来配置不同环境的配置,

  • 我正在尝试使用maven配置文件实例化hibernate配置文件。我的配置文件位于下,在pom文件中,我标记了该文件夹以用于资源过滤。有趣的是,我可以从属性文件中加载相同的属性,而hibernate在解析配置文件时抛出异常。这是我正在使用的代码示例。 POM-资源筛选 文件结构 资源hibernate.cfg.xml

  • 我有一个Spring Boot项目,使用gradle,有三个Spring Profile: null application.yml(包含所有共享默认值) 应用程序-development.yml application-test.yml 应用程序-production.yml 这些环境都运行良好。问题是,当我将代码部署到heroku时,heroku运行“gradle build”(它又运行“gr