Avro schema设置可选字段后仍报字段不存在错误如何解决
根本原因
你使用的Avro官方JsonDecoder默认采用严格匹配模式,其设计定位是解析Avro自身序列化输出的标准JSON格式数据,要求输入JSON必须包含schema定义的所有字段,不会自动填充字段的默认值,哪怕字段已配置default: null也会抛出缺失字段错误。
解决方案1(兼容性最高,推荐):使用Jackson+Avro内置JSON转换工具
该方式会自动识别schema配置的默认值,填充缺失字段:
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.avro.generic.GenericData; import org.apache.avro.generic.GenericRecord; import org.apache.avro.data.Json; // 转换逻辑 ObjectMapper objectMapper = new ObjectMapper(); JsonNode jsonNode = objectMapper.readTree(eventDto.toString()); GenericRecord genericRecord = (GenericData.Record) Json.jsonToAvro(jsonNode, schema);
解决方案2:继续使用Decoder模式,关闭严格校验
该方案要求Avro版本 >= 1.9.0:
DecoderFactory decoderFactory = new DecoderFactory(); // 关闭严格字段校验,允许缺失字段 Decoder decoder = decoderFactory.jsonDecoder(schema, eventDto.toString()) .configure("avro.json.strict", false); // 同时传入读写schema(两个参数相同即可),触发默认值填充逻辑 DatumReader<GenericData.Record> reader = new GenericDatumReader<>(schema, schema); GenericRecord genericRecord = reader.read(null, decoder);
额外校验点
- 确认你的schema配置符合规范:可选字段的type数组第一个值为
null,default值为null,当前你的字段配置是符合要求的,无需修改 - 若使用嵌套schema,需确保嵌套层级的可选字段也正确配置了默认值
内容的提问来源于stack exchange,提问作者pacman
相关产品推荐
相关产品推荐

