首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring-integration: SplitterFactoryBean只能引用一次

spring-integration: SplitterFactoryBean只能引用一次
EN

Stack Overflow用户
提问于 2021-06-14 15:53:16
回答 1查看 51关注 0票数 0

我有一个Spring项目(如果相关的话,不使用Spring ),我试图使用Postgres驱动程序连接到本地数据库。(本地数据库实际上是Yugabyte,但应该与Postgres驱动程序完全兼容。)

启动应用程序时,我会收到以下错误消息:

代码语言:javascript
复制
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依赖关系(除其他外):

代码语言:javascript
复制
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中):

代码语言:javascript
复制
@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类

代码语言:javascript
复制
<context:annotation-config />
<bean class="my.package.Config" />

然后尝试启动应用程序会产生错误消息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-15 12:01:51

我知道问题出在哪里,但我仍然不知道它与<splitter>有什么关系。

问题是,除了数据库内容之外,Config类还包括一个用来加密数据的bean。事实证明,这个bean也是在顶层项目使用的另一个库中定义的。修复这个重复的bean问题使错误消失了。

我以一种迂回的方式发现了这一点:我将dao项目及其配置包含在使用Spring的另一个顶级项目中。这导致了关于加密器bean有两个定义的明确错误消息。

如果有人能解释为什么在非启动情况下错误信息如此神秘,那将是一个很好的补充答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67973488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档