我有一个Spring项目(如果相关的话,不使用Spring ),我试图使用Postgres驱动程序连接到本地数据库。(本地数据库实际上是Yugabyte,但应该与Postgres驱动程序完全兼容。)
启动应用程序时,我会收到以下错误消息:
java.lang.IllegalArgumentException: An AbstractMessageProducingMessageHandler may only be referenced once (org.springframework.integration.config.SplitterFactoryBean#0) - use scope="prototype"
at org.springframework.util.Assert.isTrue(Assert.java:118)
at org.springframework.integration.config.AbstractStandardMessageHandlerFactoryBean.checkReuse(AbstractStandardMessageHandlerFactoryBean.java:168)
at org.springframework.integration.config.AbstractStandardMessageHandlerFactoryBean.createHandler(AbstractStandardMessageHandlerFactoryBean.java:137)
at org.springframework.integration.config.AbstractSimpleMessageHandlerFactoryBean.createHandlerInternal(AbstractSimpleMessageHandlerFactoryBean.java:186)
at org.springframework.integration.config.AbstractSimpleMessageHandlerFactoryBean.getObject(AbstractSimpleMessageHandlerFactoryBean.java:174)
at org.springframework.integration.config.AbstractSimpleMessageHandlerFactoryBean.getObject(AbstractSimpleMessageHandlerFactoryBean.java:59)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:171)
... 52 more这个错误我一点也放不下。堆栈溢出上有one similar question,但是询问者似乎实际上知道他们在做什么,以及这与spring集成有什么关系。然而,我一点也不知道我在尝试‘重用’任何东西。所引用的问题似乎也与数据库配置无关。
我的设置/配置有点复杂,所以我将尝试引用那些似乎相关的部分。
我有一个dao层项目,它有以下的gradle依赖关系(除其他外):
implementation("org.springframework:spring-context:5.2.2.RELEASE")
implementation("org.springframework:spring-jdbc:5.2.2.RELEASE")
implementation("org.jooq:jooq-kotlin:3.14.11")
runtimeOnly("org.postgresql:postgresql:42.2.19.jre7")在同一个项目中,我有一些配置(在Kotlin中):
@Configuration
open class Config {
@Bean
open fun jdbcTemplate(dataSource: DataSource): JdbcTemplate = JdbcTemplate(dataSource)
@Bean
open fun dslContext(): DSLContext = DefaultDSLContext(SQLDialect.POSTGRES)
@Configuration
@Profile("!unittest")
open inner class NonTestConfig {
@Bean
open fun dataSource(): DataSource {
return DriverManagerDataSource().apply {
// Hardcoded properties to be replaced by values from property file
setDriverClassName("org.postgresql.Driver")
url = "jdbc:postgresql://localhost:5433/demo"
username = "yugabyte"
password = "yugabyte"
}
}
}
}(注意: DSLContext bean用于JOOQL,它是为了完整性而包含的。内部类配置是存在的,因为有一个独立的单元测试配置的嵌入式数据库-一个工作得很好!
现在,上面的项目在包含实际应用程序的顶级项目中使用。这是一个maven运行时依赖项。我使用this method导入该项目的XML配置中的config类
<context:annotation-config />
<bean class="my.package.Config" />然后尝试启动应用程序会产生错误消息。
发布于 2021-06-15 12:01:51
我知道问题出在哪里,但我仍然不知道它与<splitter>有什么关系。
问题是,除了数据库内容之外,Config类还包括一个用来加密数据的bean。事实证明,这个bean也是在顶层项目使用的另一个库中定义的。修复这个重复的bean问题使错误消失了。
我以一种迂回的方式发现了这一点:我将dao项目及其配置包含在使用Spring的另一个顶级项目中。这导致了关于加密器bean有两个定义的明确错误消息。
如果有人能解释为什么在非启动情况下错误信息如此神秘,那将是一个很好的补充答案。
https://stackoverflow.com/questions/67973488
复制相似问题