升级 Spring 集成版本后出现 Class 转换异常
Getting Class cast exception after upgrading Spring Integration version
我有一个 Spring 集成应用程序,它从 AS400 DB 中轮询数据,然后在进行一些修改后将其传输到 MQ。
运行 很好,直到我决定升级 Spring 集成版本。
从版本 spring-integration-core-2.2.3.RELEASE
升级到 spring-integration-core-3.0.1.RELEASE
.
后出现以下错误
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [tcm-hosttrade-inbound-adapter.xml]; nested exception is java.lang.ClassCastException: org.springframework.beans.factory.config.RuntimeBeanReference cannot be cast to org.springframework.beans.factory.config.BeanDefinition
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:412)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinitionDocumentReader.java:250)
... 21 more
Caused by: java.lang.ClassCastException: org.springframework.beans.factory.config.RuntimeBeanReference cannot be cast to org.springframework.beans.factory.config.BeanDefinition
at org.springframework.integration.config.xml.AbstractPollingInboundChannelAdapterParser.doParse(AbstractPollingInboundChannelAdapterParser.java:50)
at org.springframework.integration.config.xml.AbstractChannelAdapterParser.parseInternal(AbstractChannelAdapterParser.java:66)
at org.springframework.beans.factory.xml.AbstractBeanDefinitionParser.parse(AbstractBeanDefinitionParser.java:59)
at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:73)
at org.springframework.integration.config.xml.AbstractIntegrationNamespaceHandler.parse(AbstractIntegrationNamespaceHandler.java:94)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1438)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1428)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:195)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:139)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:108)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)
... 26 more
我检查了class的代码 - org.springframework.integration.config.xml.AbstractPollingInboundChannelAdapterParser
我只是发现这3行代码与早期版本不同 -
String channelAdapterId = this.resolveId(element, adapterBuilder.getRawBeanDefinition(), parserContext);
String sourceBeanName = channelAdapterId + ".source";
parserContext.getRegistry().registerBeanDefinition(sourceBeanName, (BeanDefinition) source);
所以错误是因为这一行 - parserContext.getRegistry().registerBeanDefinition(sourceBeanName, (BeanDefinition) source);
我怎样才能使这段代码工作?以下是我的豆子,可以作为参考 -
入站通道 Bean -
<inbound-channel-adapter id="inboundAdapter"
ref="readFromMessageStore"
channel="inboundChannel" auto-startup="false" />
是的,3.0.1
版本有问题。它在 3.0.2
版本中得到解决。您可以查看此 link 了解详细信息:https://jira.spring.io/browse/INT-3300.
页面 link 的小摘要:
Summary Class cast exception using DefaultInboundChannelAdapterParser
Regression: Class cast exception using DefaultInboundChannelAdapterParser
Fix Version/s 3.0.2 [ 14362 ]
Fix Version/s 4.0 M4 [ 14361 ]
Affects Version/s 3.0.1 [ 14309 ]
升级到新版本时,一般建议使用该行的最新版本;我很好奇你为何选择 3.0.1
,而该行的最新版本是 3.0.7
。当前版本为4.1.5
;参见 the project page for complete version information. Generally, point releases (3.0.2, 3.0.3 etc) contain just bug fixes. Also, please pay attention to the migration guides。
我有一个 Spring 集成应用程序,它从 AS400 DB 中轮询数据,然后在进行一些修改后将其传输到 MQ。
运行 很好,直到我决定升级 Spring 集成版本。
从版本 spring-integration-core-2.2.3.RELEASE
升级到 spring-integration-core-3.0.1.RELEASE
.
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [tcm-hosttrade-inbound-adapter.xml]; nested exception is java.lang.ClassCastException: org.springframework.beans.factory.config.RuntimeBeanReference cannot be cast to org.springframework.beans.factory.config.BeanDefinition
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:412)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinitionDocumentReader.java:250)
... 21 more
Caused by: java.lang.ClassCastException: org.springframework.beans.factory.config.RuntimeBeanReference cannot be cast to org.springframework.beans.factory.config.BeanDefinition
at org.springframework.integration.config.xml.AbstractPollingInboundChannelAdapterParser.doParse(AbstractPollingInboundChannelAdapterParser.java:50)
at org.springframework.integration.config.xml.AbstractChannelAdapterParser.parseInternal(AbstractChannelAdapterParser.java:66)
at org.springframework.beans.factory.xml.AbstractBeanDefinitionParser.parse(AbstractBeanDefinitionParser.java:59)
at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:73)
at org.springframework.integration.config.xml.AbstractIntegrationNamespaceHandler.parse(AbstractIntegrationNamespaceHandler.java:94)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1438)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1428)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:195)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:139)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:108)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)
... 26 more
我检查了class的代码 - org.springframework.integration.config.xml.AbstractPollingInboundChannelAdapterParser
我只是发现这3行代码与早期版本不同 -
String channelAdapterId = this.resolveId(element, adapterBuilder.getRawBeanDefinition(), parserContext);
String sourceBeanName = channelAdapterId + ".source";
parserContext.getRegistry().registerBeanDefinition(sourceBeanName, (BeanDefinition) source);
所以错误是因为这一行 - parserContext.getRegistry().registerBeanDefinition(sourceBeanName, (BeanDefinition) source);
我怎样才能使这段代码工作?以下是我的豆子,可以作为参考 -
入站通道 Bean -
<inbound-channel-adapter id="inboundAdapter"
ref="readFromMessageStore"
channel="inboundChannel" auto-startup="false" />
是的,3.0.1
版本有问题。它在 3.0.2
版本中得到解决。您可以查看此 link 了解详细信息:https://jira.spring.io/browse/INT-3300.
页面 link 的小摘要:
Summary Class cast exception using DefaultInboundChannelAdapterParser
Regression: Class cast exception using DefaultInboundChannelAdapterParser Fix Version/s 3.0.2 [ 14362 ] Fix Version/s 4.0 M4 [ 14361 ] Affects Version/s 3.0.1 [ 14309 ]
升级到新版本时,一般建议使用该行的最新版本;我很好奇你为何选择 3.0.1
,而该行的最新版本是 3.0.7
。当前版本为4.1.5
;参见 the project page for complete version information. Generally, point releases (3.0.2, 3.0.3 etc) contain just bug fixes. Also, please pay attention to the migration guides。