Java Kafka Avro使用模式注册表将序列化/反序列化为具体类型失败

Java Kafka Avro使用模式注册表将序列化/反序列化为具体类型失败,java,apache-kafka,avro,confluent-platform,confluent-schema-registry,Java,Apache Kafka,Avro,Confluent Platform,Confluent Schema Registry,我似乎无法在其具体的avro实现中使用消息,我得到以下例外: class org.apache.avro.generic.GenericData$Record cannot be cast to class my.package.MyConcreteClass 下面是代码(我使用springboot) MyProducer.java private final KafkaTemplate<String, MyConcreteClass> kafkaTemplate; public

我似乎无法在其具体的avro实现中使用消息,我得到以下例外:

class org.apache.avro.generic.GenericData$Record cannot be cast to class my.package.MyConcreteClass
下面是代码(我使用
springboot

MyProducer.java

private final KafkaTemplate<String, MyConcreteClass> kafkaTemplate;

public PositionProducer(KafkaTemplate<String, MyConcreteClass> kafkaTemplate) {
    this.kafkaTemplate = kafkaTemplate;
}

public void sendMessage(MyConcreteClass myConcreteClass) {
    this.kafkaTemplate.send(topic, myConcreteClass);
}
@KafkaListener(topics = "#{'${consumer.topic.name}'}", groupId = "#{'${spring.kafka.consumer.group-id}'}")
public void listen(MyConcreteClass incomingMsg) {
    //handle
}
请注意,如果我将所有内容更改为
genericord
,则反序列化工作正常,因此我知道所有配置(未粘贴)都已正确配置

同样重要的是,我没有自己注册模式,而是让我的客户机代码为我注册

有什么想法吗

编辑:

配置:

@Bean
public ConsumerFactory<String, MyConcreteClass> consumerFactory() {
    Map<String, Object> props = new HashMap<>();
    props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
    props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
    props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");
    props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "io.confluent.kafka.serializers.KafkaAvroDeserializer");
    props.put(KafkaAvroDeserializerConfig.SCHEMA_REGISTRY_URL_CONFIG, schemaRegistryUrl);
    return new DefaultKafkaConsumerFactory<>(props);
}
@Bean
公共消费者工厂消费者工厂(){
Map props=newhashmap();
put(ConsumerConfig.BOOTSTRAP\u server\u CONFIG,bootstrapserver);
props.put(ConsumerConfig.GROUP\u ID\u CONFIG,groupId);
put(ConsumerConfig.KEY_反序列化程序_CLASS_CONFIG,“org.apache.kafka.common.serialization.StringDeserializer”);
put(ConsumerConfig.VALUE_反序列化程序_CLASS_配置,“io.confluent.kafka.serializers.kafkavrodeserializer”);
put(KafkaAvroDeserializerConfig.SCHEMA\u REGISTRY\u URL\u CONFIG,schemaRegistryUrl);
返回新的默认卡夫卡消费工厂(道具);
}

您需要自定义用户配置。
ContentDeserializer必须是KafkaAvroDeserializer,并引用您的架构注册表。

MyConcreteClass需要扩展SpecificRecord

您可以使用Avro-maven插件从模式生成它

然后,您必须配置序列化程序以知道您想要使用特定记录


props.put(kafkaavroderializerconfig.SPECIFIC_AVRO_READER_CONFIG,“true”)

问题从未提及ContentDeserializer谢谢,这似乎已经超越了最初的异常,但现在我得到:
原因是:org.apache.kafka.common.errors.SerializationException:在查找特定记录的读取器架构时,找不到编写器架构中指定的类my.package.MyConcreteClass。
它正在尝试查找生产者应用程序中的
my.package
。您需要将架构外部化从两个应用程序到一个外部依赖项,您能为我指出关于这方面的最佳实践的正确方向吗?我没有链接。尝试研究Maven或Gradle多模块项目,并设置一个私有JAR存储库,以便在Java项目之间共享