Spring Boot 3.0.1升级后Spring Integration Flow出现ClassCastException
Spring Boot 3.0.1 + Spring Integration 6.0.0 + Spring Cloud Stream 4.0.0 升级后ClassCastException异常问题
升级完成后,原本正常运行的Spring Integration Flow抛出ClassCastException:
class org.springframework.messaging.handler.HandlerMethod$HandlerMethodParameter cannot be cast to class java.lang.reflect.Type (org.springframework.messaging.handler.HandlerMethod$HandlerMethodParameter is in unnamed module of loader 'app'; java.lang.reflect.Type is in module java.base of loader 'bootstrap')
更新: 异常源自Spring Cloud Function Context中的JsonMessageConverter,在尝试将类型为HandlerMethodParameter的conversionHint对象强制转换为Type时触发:
Cannot cast 'org.springframework.messaging.handler.HandlerMethod$HandlerMethodParameter' to 'java.lang.reflect.Type'
受影响的集成流及Transformer代码
集成Flow定义
@Bean IntegrationFlow extract(SessionFactory<SftpClient.DirEntry> sftpSessionFactory, XmlFileTransformer xmlFileTransformer){ return IntegrationFlow .from(Sftp.inboundAdapter(sftpSessionFactory) .preserveTimestamp(true) .remoteDirectory("foo") .regexFilter(".*\\.txt$") .localDirectory(new File("sftp-inbound")), e -> e.id("sftpInboundAdapter") .autoStartup(true) .poller(Pollers.fixedDelay(5000)) ) .log(LoggingHandler.Level.DEBUG, "ExtractFlow", m -> "Successfully reached") .wireTap(MONITORING_FLOW) .log(LoggingHandler.Level.DEBUG, "ExtractFlow", m -> "Successfully done wire tap") .transform(xmlFileTransformer) .log(LoggingHandler.Level.DEBUG, "ExtractFlow", m -> "Successfully done transformation") .handle(m -> xmlProcessor.process((XmlFile) m.getPayload()) .get(); }
XmlFileTransformer实现
@RequiredArgsConstructor @Component public class XmlFileTransformer implements GenericTransformer<Message<File>, XmlFile> { @Override public XmlFile transform(Message<File> message) { return new XmlFile(message.getPayload().toPath(), message.getHeaders().get("x-origin", String.class)); } }
wiretap对应的集成流同样通过实现GenericTransformer进行转换(写法与XmlFileTransformer类似),随后使用Amqp.outboundAdapter发送消息。
xmlProcessor.process方法接收XmlFile作为参数,但该方法从未被执行——异常在尝试通过wiretap时就会触发;若注释wiretap,则在执行xmlFileTransformer转换时触发异常。日志消息"Successfully reached"输出后立即出现异常。
相关依赖配置
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>2022.0.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.0.1</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream-binder-rabbit</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-sftp</artifactId> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-xml</artifactId> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-amqp</artifactId> </dependency> </dependencies>
已反复检查依赖,确保没有新旧版本冲突,大部分依赖使用spring-boot-starter-parent提供的版本。对照Spring Integration 6.0.0迁移指南,未发现遗漏的重大变更,也未找到类似的升级案例。
请问这是Spring Integration的Bug吗?还是需要重构代码适配Spring Integration 6.0?或是我忽略了某些依赖问题?
内容的提问来源于stack exchange,提问作者Noreia
相关产品推荐
相关产品推荐

