You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 19:02:22