Java 同一类不可分配。同一类的类加载器不同

Java 同一类不可分配。同一类的类加载器不同,java,spring,Java,Spring,我有一个spring程序,可以阅读来自卡夫卡主题的avro消息。 当消息读取发生异常时: org.springframework.messaging.converter.MessageConversionException:无法从[com.mycompany.myapp.domain.avro.GreetingRecord]转换为[com.mycompany.myapp.domain.avro.GreetingRecord] 在调试中,我看到ClassUtils.isAssignable对于同一

我有一个spring程序,可以阅读来自卡夫卡主题的avro消息。 当消息读取发生异常时:

org.springframework.messaging.converter.MessageConversionException:无法从[com.mycompany.myapp.domain.avro.GreetingRecord]转换为[com.mycompany.myapp.domain.avro.GreetingRecord]

在调试中,我看到ClassUtils.isAssignable对于同一个类返回false:

Class <?> targetClass = parameter.getParameterType();
Class <?> payloadClass = payload.getClass();
if (ClassUtils.isAssignable(targetClass, payloadClass)) { // return false for same class
    this.validate(message, parameter, payload);
    return payload;
} else {
    if (this.converter instanceof SmartMessageConverter) {
        SmartMessageConverter smartConverter = (SmartMessageConverter)this.converter;
        payload = smartConverter.fromMessage(message, targetClass, parameter);
    } else {
        payload = this.converter.fromMessage(message, targetClass);
    }
}
如何解决不同类加载器的问题?

似乎是一个问题

这是因为该类已由两个不同的类装入器装入。你不能在他们之间转换。确保只使用一个类加载器

我在这里找到了解决方法:

}


关闭spring.devtools.restart解决问题:

我有一个解决方案。只要您使用Spring,我想您可能会使用Spring开发工具

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional>
</dependency>

org.springframework.boot
弹簧靴开发工具
运行时
真的
删除导致故障的依赖项:

org.springframework.kafka.listener.ListenerExecutionFailedException: Listener method 'public void org.company.MyKafkaConsumer.consume(org.apache.kafka.clients.consumer.ConsumerRecord<java.lang.String, org.mycompany.avro.MyAvroObject>,org.springframework.kafka.support.Acknowledgment)' threw exception; nested exception is java.lang.ClassCastException: class org.mycompany.avro.MyAvroObject cannot be cast to class org.mycompany.avro.MyAvroObject (org.mycompany.avro.MyAvroObject is in unnamed module of loader 'app'; org.mycompany.avro.MyAvroObject is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @3a9df291); nested exception is java.lang.ClassCastException: class org.mycompany.avro.MyAvroObject cannot be cast to class org.mycompany.avro.MyAvroObject (org.mycompany.avro.MyAvroObject is in unnamed module of loader 'app'; org.mycompany.avro.MyAvroObject is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @3a9df291)
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.decorateException(KafkaMessageListenerContainer.java:1899) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeErrorHandler(KafkaMessageListenerContainer.java:1887) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeRecordListener(KafkaMessageListenerContainer.java:1792) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeWithRecords(KafkaMessageListenerContainer.java:1719) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeRecordListener(KafkaMessageListenerContainer.java:1617) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeListener(KafkaMessageListenerContainer.java:1348) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.pollAndInvoke(KafkaMessageListenerContainer.java:1064) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:972) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) ~[na:na]
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
    at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
Caused by: java.lang.ClassCastException: class org.mycompany.avro.MyAvroObject cannot be cast to class org.mycompany.avro.MyAvroObject (org.mycompany.avro.MyAvroObject is in unnamed module of loader 'app'; org.mycompany.avro.MyAvroObject is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @3a9df291)
    at org.company.MyKafkaConsumer.consume(NiaKafkaConsumer.java:33) ~[classes/:na]
    at jdk.internal.reflect.GeneratedMethodAccessor81.invoke(Unknown Source) ~[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.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:171) ~[spring-messaging-5.2.7.RELEASE.jar:5.2.7.RELEASE]
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:120) ~[spring-messaging-5.2.7.RELEASE.jar:5.2.7.RELEASE]
    at org.springframework.kafka.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:48) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:334) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.adapter.RecordMessagingMessageListenerAdapter.onMessage(RecordMessagingMessageListenerAdapter.java:86) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.adapter.RecordMessagingMessageListenerAdapter.onMessage(RecordMessagingMessageListenerAdapter.java:51) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeOnMessage(KafkaMessageListenerContainer.java:1854) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeOnMessage(KafkaMessageListenerContainer.java:1836) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeRecordListener(KafkaMessageListenerContainer.java:1779) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    ... 8 common frames omitted
org.springframework.kafka.listener.ListenerExecutionFailedException:listener方法“public void org.company.MyKafkaConsumer.consumer(org.apache.kafka.clients.consumer.ConsumerRecord,org.springframework.kafka.support.acknowledgement)”引发异常;嵌套异常为java.lang.ClassCastException:类org.mycompany.avro.MyAvroObject不能强制转换为类org.mycompany.avro.MyAvroObject(org.mycompany.avro.MyAvroObject位于加载程序“app”的未命名模块中;org.mycompany.avro.MyAvroObject位于加载程序org.springframework.boot.devtools.restart.classloader.RestartClassLoader@3a9df291的未命名模块中);嵌套异常为java.lang.ClassCastException:类org.mycompany.avro.MyAvroObject不能强制转换为类org.mycompany.avro.MyAvroObject(org.mycompany.avro.MyAvroObject位于加载程序“app”的未命名模块中;org.mycompany.avro.MyAvroObject位于加载程序org.springframework.boot.devtools.restart.classloader.RestartClassLoader@3a9df291的未命名模块中)
在org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.decorateException(KafkaMessageListenerContainer.java:1899)~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
在org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeErrorHandler(KafkaMessageListenerContainer.java:1887)~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
在org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeRecordListener(KafkaMessageListenerContainer.java:1792)~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
在org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeWithRecords(KafkaMessageListenerContainer.java:1719)~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
在org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokereRecordListener(KafkaMessageListenerContainer.java:1617)~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
在org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeListener(KafkaMessageListenerContainer.java:1348)~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
在org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.pollAndInvoke(KafkaMessageListenerContainer.java:1064)~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
在org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:972)~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
在java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)~[na:na]
在java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)~[na:na]
在java.base/java.lang.Thread.run(Thread.java:834)~[na:na]
原因:java.lang.ClassCastException:class org.mycompany.avro.MyAvroObject无法强制转换为class org.mycompany.avro.MyAvroObject(org.mycompany.avro.MyAvroObject位于加载程序“app”的未命名模块中;org.mycompany.avro.MyAvroObject位于加载程序org.springframework.boot.devtools.restart.classloader.RestartClassLoader@3a9df291的未命名模块中)
在org.company.MyKafkaConsumer.consumer(NiaKafkaConsumer.java:33)~[classes/:na]
在jdk.internal.reflect.GeneratedMethodAccessor81.invoke(未知源)~[na:na]
在java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)~[na:na]
在java.base/java.lang.reflect.Method.invoke(Method.java:566)~[na:na]
在org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:171)~[spring-messaging-5.2.7.RELEASE.jar:5.2.7.RELEASE]
在org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:120)~[spring-messaging-5.2.7.RELEASE.jar:5.2.7.RELEASE]
在org.springframework.kafka.listener.adapter.handleAdapter.invoke(handleAdapter.java:48)~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
在org.springframework.kafka.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:334)~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
在org.springframework.kafka.listener.adapter.RecordMessagingMessageListenerAdapter.onMessage(RecordMessagingMessageListenerAdapter.java:86)~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
在org.springframework.kafka.listener.adapter.RecordMessagingMessageListenerAdapter.onMessage(RecordMessagingMessageListenerAdapter.java:51)~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
在org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeOnMessage(KafkaMessageListenerContainer.java:1854)~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
在org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeOnMessage(KafkaMessageListenerContainer.java:1836)~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
位于org.springframework.kafka.listener。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional>
</dependency>
org.springframework.kafka.listener.ListenerExecutionFailedException: Listener method 'public void org.company.MyKafkaConsumer.consume(org.apache.kafka.clients.consumer.ConsumerRecord<java.lang.String, org.mycompany.avro.MyAvroObject>,org.springframework.kafka.support.Acknowledgment)' threw exception; nested exception is java.lang.ClassCastException: class org.mycompany.avro.MyAvroObject cannot be cast to class org.mycompany.avro.MyAvroObject (org.mycompany.avro.MyAvroObject is in unnamed module of loader 'app'; org.mycompany.avro.MyAvroObject is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @3a9df291); nested exception is java.lang.ClassCastException: class org.mycompany.avro.MyAvroObject cannot be cast to class org.mycompany.avro.MyAvroObject (org.mycompany.avro.MyAvroObject is in unnamed module of loader 'app'; org.mycompany.avro.MyAvroObject is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @3a9df291)
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.decorateException(KafkaMessageListenerContainer.java:1899) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeErrorHandler(KafkaMessageListenerContainer.java:1887) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeRecordListener(KafkaMessageListenerContainer.java:1792) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeWithRecords(KafkaMessageListenerContainer.java:1719) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeRecordListener(KafkaMessageListenerContainer.java:1617) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeListener(KafkaMessageListenerContainer.java:1348) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.pollAndInvoke(KafkaMessageListenerContainer.java:1064) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:972) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) ~[na:na]
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
    at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
Caused by: java.lang.ClassCastException: class org.mycompany.avro.MyAvroObject cannot be cast to class org.mycompany.avro.MyAvroObject (org.mycompany.avro.MyAvroObject is in unnamed module of loader 'app'; org.mycompany.avro.MyAvroObject is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @3a9df291)
    at org.company.MyKafkaConsumer.consume(NiaKafkaConsumer.java:33) ~[classes/:na]
    at jdk.internal.reflect.GeneratedMethodAccessor81.invoke(Unknown Source) ~[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.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:171) ~[spring-messaging-5.2.7.RELEASE.jar:5.2.7.RELEASE]
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:120) ~[spring-messaging-5.2.7.RELEASE.jar:5.2.7.RELEASE]
    at org.springframework.kafka.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:48) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:334) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.adapter.RecordMessagingMessageListenerAdapter.onMessage(RecordMessagingMessageListenerAdapter.java:86) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.adapter.RecordMessagingMessageListenerAdapter.onMessage(RecordMessagingMessageListenerAdapter.java:51) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeOnMessage(KafkaMessageListenerContainer.java:1854) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeOnMessage(KafkaMessageListenerContainer.java:1836) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeRecordListener(KafkaMessageListenerContainer.java:1779) ~[spring-kafka-2.5.2.RELEASE.jar:2.5.2.RELEASE]
    ... 8 common frames omitted