Avro logicalType使用异常:java.util.Date无法转换为java.lang.Number
解决Avro logicalType导致的ClassCastException(Date转Number失败)
问题根源
Avro反射序列化器(ReflectDatumWriter)默认未启用逻辑类型转换器,直接将java.util.Date对象按Schema定义的long类型处理,触发类型转换异常。另外你声明使用Avro 1.10.0,但报错栈显示实际依赖为1.11.0,版本不一致也可能引发兼容性问题。
解决方案
显式添加逻辑类型转换器
创建ReflectDatumWriter时,需配置包含逻辑类型转换的ReflectData,示例代码:import org.apache.avro.reflect.ReflectData; import org.apache.avro.reflect.ReflectDatumWriter; import org.apache.avro.conversions.TimestampMillisConversion; // 初始化带逻辑类型转换的ReflectData ReflectData reflectData = ReflectData.get(); reflectData.addLogicalTypeConversion(new TimestampMillisConversion()); // 创建配置后的序列化器 ReflectDatumWriter<demo> writer = new ReflectDatumWriter<>(demo.class, reflectData);若需支持空值,可使用
ReflectData.AllowNull:ReflectData reflectData = ReflectData.AllowNull.get(); reflectData.addLogicalTypeConversion(new TimestampMillisConversion());统一Avro依赖版本
检查项目依赖,确保所有Avro相关包(avro、avro-reflect等)版本一致,避免混合1.10.0和1.11.0版本。用注解明确字段映射(可选)
在POJO的Date字段上添加@AvroSchema注解,强制指定逻辑类型,避免自动生成Schema时的映射偏差:import org.apache.avro.reflect.AvroSchema; import java.util.Date; public class demo { @AvroSchema("{\"type\": \"long\", \"logicalType\": \"timestamp-millis\"}") private Date startedAt; @AvroSchema("{\"type\": \"long\", \"logicalType\": \"timestamp-millis\"}") private Date completedAt; }
内容的提问来源于stack exchange,提问作者Nikita
相关产品推荐
相关产品推荐

