InfluxDB 2写入Long类型标签,读取时触发ClassCastException类型转换异常
问题解决:InfluxDB标签字段读取时类型转换异常
问题原因
InfluxDB的标签(Tag)字段本质上只支持字符串类型,不管写入时传入的是什么数据类型,最终都会被序列化为字符串存储。你写入时用Long类型的myTag作为标签,客户端自动帮你转成字符串存入数据库,但读取时客户端默认会把标签值按String类型解析,而你的POJO中myTag定义为Long,类型不匹配就触发了ClassCastException。
解决方案
方案一:修改POJO字段类型为String(最简单)
直接把myTag的类型改成String,读取后如果需要用Long,可以手动转换:
@Data @Builder @NoArgsConstructor @AllArgsConstructor @Measurement(name = "my_measurement") public class MyMeasurement { @Column(timestamp = true) private Instant time; @Column(name = "my_tag", tag = true) private String myTag; // 改为String类型 @Column(name = "value") private Integer value; // 可选:添加便捷方法,快速转成Long public Long getMyTagAsLong() { return myTag != null ? Long.parseLong(myTag) : null; } }
方案二:自定义类型转换器(保留POJO的Long类型)
通过自定义转换器,让客户端在读取时自动将标签的字符串值转成Long:
- 实现类型转换器:
public class StringToLongConverter implements Converter<String, Long> { @Override public Long convert(String value) { return value != null ? Long.parseLong(value) : null; } }
- 注册转换器并执行查询:
// 构建带转换器的QueryApi QueryApi queryApi = influxDBClient.getQueryApi( QueryOptions.builder() .addConverter(Long.class, new StringToLongConverter()) .build() ); // 执行查询,此时会自动转换myTag的类型 List<MyMeasurement> results = queryApi.query( "from(bucket: \"mybucket\") |> range(start: -1d) |> filter(fn: (r) => r[\"_measurement\"] == \"my_measurement\")", MyMeasurement.class );
内容的提问来源于stack exchange,提问作者Jiruffe
相关产品推荐
相关产品推荐

