我正在尝试对用Kotlin编写的Micronaut Web应用程序使用两个数据源:一个具有mysql数据库的数据源,以及一个在执行测试时要使用的内存H2数据库中的数据源。
我尝试仅使用h2
数据库作为默认生产数据源,因此有关它的配置字段应该正确。
通过执行,应用程序将按预期与mysql数据源一起运行 ./gradlew run
application.yml
并application-test.yml
在src/main/resources/
目录中,也将只application-test.yml
在src/test/resources/
,没有结果。@MicronautTest
注释来声明test
环境和application = BookieSparaerverApplication
参数无效。@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-test.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
在代码中)时,似乎EntityManager
未创建Bean,因此无法实例化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
并打开报告,或在激活日志的情况下运行它。
编辑:我已经用伊凡·洛佩兹(Ivan Lopez)的建议更新了说明,但错误和预期结果仍然相同。
您的示例应用程序正在使用1.1.1,micronaut-hibernate-jpa
其中不支持
jpa:
default:
entity-scan:
packages:
- 'com.transgressoft.bookieserver.domain'
您必须jpa.default.packages-to-scan
改为使用文档说明中的内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句