简体   繁体   English

从 Spring Boot 2.1.9 升级到 2.2.1(Spring 集成)后的 ClassCastException

[英]ClassCastException after upgrading from Spring Boot 2.1.9 to 2.2.1 (Spring Integration)

I have a Spring Boot project that uses Spring Integration.我有一个使用 Spring 集成的 Spring 引导项目。 I upgraded from Spring Boot 2.1.9.RELEASE to 2.2.1.RELEASE and now I get an exception when my application starts up.我从 Spring Boot 2.1.9.RELEASE 升级到 2.2.1.RELEASE,现在我的应用程序启动时出现异常。

The exception is logged at DEBUG level and my application still seems to work without problems.异常记录在调试级别,我的应用程序似乎仍然可以正常工作。

Is this a bug in the new version of Spring Integration?这是新版Spring集成的bug吗?

Stack trace:堆栈跟踪:

2019-11-09 11:57:28.983 DEBUG 12776 --- [  restartedMain] o.s.i.h.s.MessagingMethodInvokerHelper   : Exception trying to extract interface

java.lang.ClassCastException: class com.demo.mail.ConfirmationMailTransformer cannot be cast to class org.springframework.aop.framework.Advised (com.demo.mail.ConfirmationMailTransformer is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @24ed52ef; org.springframework.aop.framework.Advised is in unnamed module of loader 'app')
    at org.springframework.integration.handler.support.MessagingMethodInvokerHelper.getTargetClass(MessagingMethodInvokerHelper.java:985) ~[spring-integration-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.integration.handler.support.MessagingMethodInvokerHelper.findHandlerMethodsForTarget(MessagingMethodInvokerHelper.java:711) ~[spring-integration-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.integration.handler.support.MessagingMethodInvokerHelper.<init>(MessagingMethodInvokerHelper.java:294) ~[spring-integration-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.integration.handler.support.MessagingMethodInvokerHelper.<init>(MessagingMethodInvokerHelper.java:215) ~[spring-integration-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.integration.handler.support.MessagingMethodInvokerHelper.<init>(MessagingMethodInvokerHelper.java:219) ~[spring-integration-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.integration.handler.MethodInvokingMessageProcessor.<init>(MethodInvokingMessageProcessor.java:54) ~[spring-integration-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.integration.transformer.MethodInvokingTransformer.<init>(MethodInvokingTransformer.java:43) ~[spring-integration-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.integration.config.TransformerFactoryBean.createMethodInvokingHandler(TransformerFactoryBean.java:53) ~[spring-integration-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.integration.config.AbstractStandardMessageHandlerFactoryBean.createHandler(AbstractStandardMessageHandlerFactoryBean.java:142) ~[spring-integration-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.integration.config.AbstractSimpleMessageHandlerFactoryBean.createHandlerInternal(AbstractSimpleMessageHandlerFactoryBean.java:198) ~[spring-integration-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.integration.config.AbstractSimpleMessageHandlerFactoryBean.getObject(AbstractSimpleMessageHandlerFactoryBean.java:186) ~[spring-integration-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.integration.config.AbstractSimpleMessageHandlerFactoryBean.getObject(AbstractSimpleMessageHandlerFactoryBean.java:60) ~[spring-integration-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:171) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:135) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:377) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:127) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:427) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:173) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1706) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1451) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:879) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878) ~[spring-context-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) ~[spring-boot-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) ~[spring-boot-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at com.demo.DemoApplication.main(DemoApplication.java:12) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.2.1.RELEASE.jar:2.2.1.RELEASE]

This is what my class ConfirmationMailTransformer looks like:这就是我的 class ConfirmationMailTransformer的样子:

package com.demo.mail;

import com.demo.model.RegistrationEvent;
import org.springframework.stereotype.Component;

@Component
public class ConfirmationMailTransformer {

    public String toMailText(RegistrationEvent event) {
        return "Email text";
    }
}

It's configured using Spring Integration XML configuration:它使用 Spring 集成 XML 配置进行配置:

<!-- Transform payload to text to be used as the body of the e-mail -->
<int:transformer ref="confirmationMailTransformer" method="toMailText"/>

Java version (AdoptOpenJDK 11 on Ubuntu 18.04): Java 版本(在 Ubuntu 18.04 上采用 OpenJDK 11):

openjdk version "11.0.4" 2019-07-16
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.4+11)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.4+11, mixed mode)

Plain Spring Boot application generated from https://start.spring.io with Spring Boot starter for Spring Integration, running with mvn spring-boot:run Plain Spring Boot application generated from https://start.spring.io with Spring Boot starter for Spring Integration, running with mvn spring-boot:run

Judging by "unnamed module" in the exception message, you are using Java's module system.从异常消息中的“未命名模块”判断,您使用的是 Java 的模块系统。 Judging by RestartClassLoader in the exception message, you are using Spring Boot's DevTools.通过异常信息中的RestartClassLoader判断,您使用的是 Spring Boot 的 DevTools。 At the time of writing, this combination is unsupported and known not to work.在撰写本文时,这种组合不受支持并且已知不起作用。 There's an open enhancement request that you may want to subscribe to.您可能想要订阅一个开放的增强请求

Regardless of the possibly unsupported combination of the module system and DevTools, the change in behaviour appears to be due to this commit in Spring Integration.不管模块系统和 DevTools 的组合可能不受支持,行为的变化似乎是由于 Spring 集成中的此提交 Previously, there was a check for AopUtils.isAopProxy(targetObject) being true before an attempt to cast to Advised was made.以前,在尝试强制转换为Advised之前,会检查AopUtils.isAopProxy(targetObject)是否为true This check is no longer made.不再进行此检查。 That should be benign although slightly ugly if you have debug logging enabled.如果您启用了调试日志记录,那应该是良性的,虽然有点难看。 You may want to raise a Spring Integration issue so that the team can investigate and reinstate the check if needed.您可能需要提出Spring 集成问题,以便团队可以调查并在需要时恢复检查。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 TypeNotPresentExceptionProxy 同时将 spring 引导启动器父级从 2.1.8 升级到 2.2.1 - TypeNotPresentExceptionProxy while upgrading spring boot starter parent from 2.1.8 to 2.2.1 如何在 spring 启动 2.1.9 中配置 ssl 证书 - how to configure ssl certificate in spring boot 2.1.9 Spring 启动 - 从 2.2.5 升级到 2.5.7 后,应用程序无法启动 - Spring Boot - After upgrading from 2.2.5 to 2.5.7, application failed to start 从 Spring Boot 2.6.7 升级到 2.7.0 后的 FlywaySqlException - FlywaySqlException after upgrading from spring boot 2.6.7 to 2.7.0 升级到Spring Boot 1.4.0后,在AbstractPlatformTransactionManager中运行NullPointerException - After upgrading to Spring Boot 1.4.0, NullPointerException in AbstractPlatformTransactionManager 升级到 Spring Boot 2 后应用程序无法启动 - Application fails to start after upgrading to Spring Boot 2 升级到Spring Boot 1.3.3后,@ Async无法正常工作 - @Async not working after upgrading to Spring Boot 1.3.3 升级弹簧整合 - Upgrading spring-integration 从Spring 3.2.3升级到Spring 4后出错 - Error after upgrading from Spring 3.2.3 to Spring 4 将 spring 从 2.1.9 升级到 2.2.0,现在启动时出现异常 - Upgraded spring boot from 2.1.9 to 2.2.0 , now getting exception while starting
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM