我在将应用程序从spring-integration 4.0.4迁移到最新的4.1.0版本时遇到问题。
一旦更换了罐子,我的集成上下文就会为每个<recipient-list-router/>
标签抛出一个异常。
引发的异常是java.lang.ClassCastException
消息是:
Caused by: java.lang.ClassCastException: com.sun.proxy.$Proxy62 cannot be cast to org.springframework.integration.context.IntegrationObjectSupport
at org.springframework.config.AbstractSimpleMessageHandlerFactoryBean.createHandlerInternal(AbstractSimpleMessageHandlerFactoryBean.java:130)
at org.springframework.integration.config.AbstractSimpleMessageHandlerFactoryBean.getObject(AbstractSimpleMessageHandlerFactoryBean.java:102)
at org.springframework.integration.config.AbstractSimpleMessageHandlerFactoryBean.getObject(AbstractSimpleMessageHandlerFactoryBean.java:44)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanReagistrySupport.java:168)
... 20 more
我正在使用Spring-Integration 4.1.0.RELEASE,spring-core 4.1.2.RELEASE,并在jdk1.8.0_05上运行。
我的Integration bean上下文包含两个
<recipient-list-router/>
标记,将其删除后不会引发此错误。 最佳答案
AbstractSimpleMessageHandlerFactoryBean
中的代码说:
else if(!(this.handler instanceof AbstractReplyProducingMessageHandler)) {
if (logger.isDebugEnabled()) {
logger.debug("adviceChain can only be set to AbstractReplyProducingMessageHandler or its subclass, "
+ ((IntegrationObjectSupport) this.handler).getComponentName() + " doesn't support it.");
}
}
因此,让我们将
debug
切换为org.springframework.integration
类别!从另一面看,我同意这是一个错误,因为如果我们的
messageHandler
是Proxy
,我们就不能简单地将其转换为IntegrationObjectSupport
。因此,随时可以为此事举起JIRA罚单。
从另一面来看,不清楚为什么删除
<recipient-list-router/>
会导致问题...因为
<recipient-list-router/>
不支持<request-handler-advice-chain>
。我同意我们在4.1中引入了
RecipientListRouterManagement
,如果您使用JMX,则将为RecipientListRouter
注册特殊的MBean,最后一个将成为Proxy
,但是代理与该代理之间的关系并不为人所知。 request-handler-advice-chain
日志消息...如果您可以从
AbstractSimpleMessageHandlerFactoryBean
调试该行并向我们展示该Proxy
的真实对象,那将是很好的。并显示更多StackTrace。也许我们可以看到更多上下文来找出原因的根源。
谢谢!