所以我有一个 avro 模式,我想发展它并使用 topicRecordName 策略。我正在使用融合模式注册表。我想让它向后兼容,并且有必要更改记录名称。 旧模式
{
"type": "record",
"name": "OldSchema",
"namespace": "com.example.kafkaschemaregistrydemo.event",
"fields": [
{
"name": "firstName",
"type": ["null", "string"],
"default": null
}
]
}
新架构
{
"type": "record",
"name": "NewSchema",
"aliases": ["OldSchema"],
"namespace": "com.example.kafkaschemaregistrydemo.event",
"fields": [
{
"name": "firstName",
"type": ["null", "string"],
"default": null
}
]
}```
I am using `KafkaAvroDeserialiser` in java to deserialize.
我处理消息的方式如下
@KafkaListener(topics = "TopicName", groupId = "test-group")
public void consume(@Payload NewSchema event){
System.out.println("Supplier New Event");
System.out.println("Consumed message" + event.toString());
}
我面临的错误
Cannot convert from [com.example.kafkaschemaregistrydemo.events.OldSchema] to [com.example.kafkaschemaregistrydemo.event.NewSchema] for GenericMessage....
我想要更改记录名称的原因是因为我有两个模式,我想将它们合并为一个事件,同时保持向后兼容性。
我尝试过的一些事情 我认为拥有别名应该足够了,特别是当其他字段的别名工作正常但不适用于 RecordName 时。
configProps.put(KafkaAvroDeserializerConfig.SPECIFIC_AVRO_READER_CONFIG, false);
SpecificRecord
和 GenericRecord
@Payload
当检查两个模式之间的兼容性并且名称不匹配时,则会检查别名。但是,它们会与编写器模式记录的“完整”名称进行比较。尝试将别名更改为“com.example.kafkaschemaregistrydemo.event.OldSchema”,看看是否有效。