Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从kafka流和Avro反序列化的同一类上的ClassCastException_Java_Apache Kafka_Avro_Apache Kafka Streams - Fatal编程技术网

Java 从kafka流和Avro反序列化的同一类上的ClassCastException

Java 从kafka流和Avro反序列化的同一类上的ClassCastException,java,apache-kafka,avro,apache-kafka-streams,Java,Apache Kafka,Avro,Apache Kafka Streams,我已经用Avro-maven插件从Avro模式生成了我的Avro-Java类。我将avro类序列化为字节数组,并将其写入kafka主题 然后我有一个卡夫卡流,它试图操纵avro数据来做一些事情。在反序列化过程中,我从同一个类获得一个ClassCastExcetion。我了解到,这个问题是由于Avro在回退时使用了不同的类加载器(类加载器的新实例)而产生的 有一种方法可以强制Avro使用调用方的类加载器或类似的东西吗 KafkaStream properties this.props = new

我已经用Avro-maven插件从Avro模式生成了我的Avro-Java类。我将avro类序列化为字节数组,并将其写入kafka主题

然后我有一个卡夫卡流,它试图操纵avro数据来做一些事情。在反序列化过程中,我从同一个类获得一个ClassCastExcetion。我了解到,这个问题是由于Avro在回退时使用了不同的类加载器(类加载器的新实例)而产生的

有一种方法可以强制Avro使用调用方的类加载器或类似的东西吗

KafkaStream properties

this.props = new Properties();
        this.props.put(StreamsConfig.APPLICATION_ID_CONFIG, "test");
        this.props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        this.props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
        this.props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.ByteArray().getClass());
我正在使用一个字符串键和序列化的avro字节数组,然后我需要手动反序列化avro的负载。 我使用avro的解码器进行如下反序列化:

AvroPayload stp = AvroPayload.fromByteBuffer(ByteBuffer.wrap(bytes));
AvroPayload stp = AvroPayload.getDecoder().decode(ByteBuffer.wrap(bytes));
甚至像这样:

AvroPayload stp = AvroPayload.fromByteBuffer(ByteBuffer.wrap(bytes));
AvroPayload stp = AvroPayload.getDecoder().decode(ByteBuffer.wrap(bytes));

在第一个版本中,我可以看到,如果我保持在avro生成的类上下文中,字节数组将正确反序列化到AvroPayload类中。返回新实例可能会抛出一个
ClassCastException

我找到的唯一解决方案是按照建议将avro类放入一个外部jar中,然后导入它

这不是一个好的解决方案,因为它需要大量的配置来保持avro模式和生成的类的耦合,但这是我发现的唯一的解决方案

我配置了一个maven项目,该项目将avro的classes jar生成到一个目录中,其名称中没有工件版本,因此我可以始终导入最新版本,而无需更改pom


如果有人将发现另一个解决方案,请发布它

您可以发布您在创建Kafka流时使用的属性吗?问题编辑您可以发布您实际上是如何序列化和反序列化消息的吗?@Fire手套您使用的是spring开发工具吗?有趣的是,在我的例子中,这是一个问题,dev tools加载了一个不同的类加载器,所以cast不能发生。我通过删除开发工具修复了我的问题(在链接中尝试了可接受的答案,但没有成功):不幸的是,我正在使用quarkus,但感谢您的回复