Java 模式演化上的Avro反序列化错误

Java 模式演化上的Avro反序列化错误,java,deserialization,avro,spring-kafka,Java,Deserialization,Avro,Spring Kafka,我有两个模式: 模式1(旧模式): 我用一个布尔字段更新了架构: 模式2(新模式): 卡夫卡主题包含属于旧模式(schema1)的消息。更新使用者架构后,使用者即使在更新字段中存在默认值,也无法反序列化旧的架构消息 根据Avro文件: if the reader's record schema has a field that contains a default value, and writer's schema does not have a field with the same nam

我有两个模式:

模式1(旧模式):

我用一个布尔字段更新了架构:

模式2(新模式):

卡夫卡主题包含属于旧模式(schema1)的消息。更新使用者架构后,使用者即使在更新字段中存在默认值,也无法反序列化旧的架构消息

根据Avro文件:

if the reader's record schema has a field that contains a default value, and writer's schema does not have a field with the same name, then the reader should use the default value from its field.
if the reader's record schema has a field with no default value, and writer's schema does not have a field with the same name, an error is signalled.

反序列化时我遇到以下错误:

java.io.EOFException: null
    at org.apache.avro.io.BinaryDecoder.readBoolean(BinaryDecoder.java:140) ~[avro-1.9.1.jar!/:1.9.1]
    at org.apache.avro.io.ValidatingDecoder.readBoolean(ValidatingDecoder.java:77) ~[avro-1.9.1.jar!/:1.9.1]
    at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:194) ~[avro-1.9.1.jar!/:1.9.1]
    at org.apache.avro.specific.SpecificDatumReader.readField(SpecificDatumReader.java:136) ~[avro-1.9.1.jar!/:1.9.1]
    at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:237) ~[avro-1.9.1.jar!/:1.9.1]
    at org.apache.avro.specific.SpecificDatumReader.readRecord(SpecificDatumReader.java:123) ~[avro-1.9.1.jar!/:1.9.1]
    at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:170) ~[avro-1.9.1.jar!/:1.9.1]
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:151) ~[avro-1.9.1.jar!/:1.9.1]
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:144) ~[avro-1.9.1.jar!/:1.9.1]
当记录缺少字段时,为什么默认值不应用于使用者?
非常感谢您的帮助。提前谢谢

尝试将
isActive
的类型更改为
boolean
null
,而不仅仅是
boolean
。比如:

{
    "name": "isActive",
    "type": ["boolean", "null"],
    "default": false
}

它将使模式向后兼容。

谢谢!很好,你好!有一点问题——默认值应该与联合中的第一个类型匹配。JavaSDK(错误地)接受了该模式,并在较新版本中中断。快速修复方法是在列表中的“null”之前加上“boolean”。很好,更新了答案@RyanSkraba
java.io.EOFException: null
    at org.apache.avro.io.BinaryDecoder.readBoolean(BinaryDecoder.java:140) ~[avro-1.9.1.jar!/:1.9.1]
    at org.apache.avro.io.ValidatingDecoder.readBoolean(ValidatingDecoder.java:77) ~[avro-1.9.1.jar!/:1.9.1]
    at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:194) ~[avro-1.9.1.jar!/:1.9.1]
    at org.apache.avro.specific.SpecificDatumReader.readField(SpecificDatumReader.java:136) ~[avro-1.9.1.jar!/:1.9.1]
    at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:237) ~[avro-1.9.1.jar!/:1.9.1]
    at org.apache.avro.specific.SpecificDatumReader.readRecord(SpecificDatumReader.java:123) ~[avro-1.9.1.jar!/:1.9.1]
    at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:170) ~[avro-1.9.1.jar!/:1.9.1]
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:151) ~[avro-1.9.1.jar!/:1.9.1]
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:144) ~[avro-1.9.1.jar!/:1.9.1]
{
    "name": "isActive",
    "type": ["boolean", "null"],
    "default": false
}