我刚刚开发了一个小的micronautcli应用程序来探索micronautjdbc和sql特性。以下是依赖项,
dependencies {
annotationProcessor("info.picocli:picocli-codegen:4.2.0")
annotationProcessor("io.micronaut.data:micronaut-data-processor")
implementation("io.micronaut:micronaut-validation")
implementation("io.micronaut:micronaut-runtime")
implementation("info.picocli:picocli")
implementation("io.micronaut.picocli:micronaut-picocli")
implementation("javax.annotation:javax.annotation-api")
implementation("io.micronaut.sql:micronaut-jdbc-dbcp")
implementation("io.micronaut.data:micronaut-data-jdbc")
runtimeOnly("ch.qos.logback:logback-classic")
runtimeOnly("com.microsoft.sqlserver:mssql-jdbc")
testImplementation("io.micronaut:micronaut-http-client")
testImplementation(platform("org.testcontainers:testcontainers-bom:1.14.3"))
testRuntimeOnly("org.testcontainers:mssqlserver")
}
应用程序运行正常,但退出时失败,出现以下错误,
java.lang.ClassCastException: class io.micronaut.transaction.jdbc.TransactionAwareDataSource$DataSourceProxy cannot be cast to class io.micronaut.configuration.jdbc.dbcp.DatasourceConfiguration (io.micronaut.transaction.jdbc.TransactionAwareDataSource$DataSourceProxy and io.micronaut.configuration.jdbc.dbcp.DatasourceConfiguration are in unnamed module of loader 'app')
at io.micronaut.configuration.jdbc.dbcp.$DatasourceConfigurationDefinition.dispose(Unknown Source)
at io.micronaut.context.BeanDefinitionDelegate$ProxyDisposableBeanDefinition.dispose(BeanDefinitionDelegate.java:257)
at io.micronaut.inject.DisposableBeanDefinition.dispose(DisposableBeanDefinition.java:41)
at io.micronaut.context.DefaultBeanContext.stop(DefaultBeanContext.java:290)
at io.micronaut.context.DefaultApplicationContext.stop(DefaultApplicationContext.java:171)
at io.micronaut.context.DefaultApplicationContext.stop(DefaultApplicationContext.java:49)
at io.micronaut.context.LifeCycle.close(LifeCycle.java:61)
at io.micronaut.configuration.picocli.PicocliRunner.run(PicocliRunner.java:115)
at mnsdb.MnsdbCommand.main(MnsdbCommand.java:21)
我尝试在中浏览基于注解生成的代码 $DatasourceConfigurationDefinition
发现dispose方法中有一条checkcast指令(check行1)
public java.lang.Object dispose(io.micronaut.context.BeanResolutionContext arg0, io.micronaut.context.BeanContext arg1, java.lang.Object arg2);
0 aload_3 [arg2]
1 checkcast io.micronaut.configuration.jdbc.dbcp.DatasourceConfiguration [9]
4 astore 4
6 aload_0 [this]
7 aload_1 [arg0]
8 aload_2 [arg1]
9 checkcast io.micronaut.context.DefaultBeanContext [593]
12 aload_3 [arg2]
13 invokespecial io.micronaut.context.AbstractParametrizedBeanDefinition.preDestroy(io.micronaut.context.BeanResolutionContext, io.micronaut.context.BeanContext, java.lang.Object) : java.lang.Object [612]
16 aload 4
18 invokevirtual io.micronaut.configuration.jdbc.dbcp.DatasourceConfiguration.preDestroy() : void [618]
21 aload 4
23 areturn
显然micronaut正在替换 io.micronaut.configuration.jdbc.dbcp.DatasourceConfiguration
与 TransactionAwareDataSource$DataSourceProxy
当上下文初始化但在处理bean时。。它失败是因为无法将代理转换为它所 Package 的示例。
这看起来像是一个非常简单的错误(micronaut的自动化测试套件可能捕捉到了这个错误),所以我觉得这一定是由于依赖项中的一些错误配置造成的。
非常感谢您的帮助。
1条答案
按热度按时间h9vpoimq1#
当我使用hikari(jdbc-hikari)代替dbcp时,问题就消失了。
所以看起来JDBCDBCP数据源实现有一些问题。