SpringBoot中如何动态设置@Measurement的名称?
动态指定InfluxDB2 Measurement名称的正确实现方式
问题原因
@Measurement注解的name参数要求是编译时常量,无法通过EL表达式#{measurementName}动态绑定POJO运行时的字段值,所以你会看到写入的measurement名称是字面字符串#{measurementName}。
解决方案:使用Point对象动态构建数据
InfluxDB Java Client提供了Point类来灵活构建写入数据,完全支持动态指定measurement名称,适配你的场景。
修改后的代码:
- 调整BillingNo类:移除
@Measurement注解(无需再通过注解指定固定measurement)
@Data public class BillingNo { private String measurementName; private Type type; private String code; private String sourceId; private String info; private boolean isRunning; private Instant time; public enum Type { PRODUCT, COMBO; } }
- 修改write方法:通过
Point动态构建数据,从BillingNo实例中获取measurement名称
public void write(String bucket, String org, BillingNo billingNo){ var writeApi = client.getWriteApiBlocking(); // 动态构建Point,使用billingNo的measurementName作为measurement名称 Point point = Point.measurement(billingNo.getMeasurementName()) .addTag("type", billingNo.getType().name()) .addTag("code", billingNo.getCode()) .addTag("sourceId", billingNo.getSourceId()) .addField("info", billingNo.getInfo()) .addField("isRunning", billingNo.isRunning()) .time(billingNo.getTime(), WritePrecision.NS); writeApi.writePoint(bucket, org, point); client.close(); }
补充说明
如果仍想基于POJO进行映射,InfluxDB Java Client的官方实现中没有直接支持动态measurement名称的注解方式,因为注解参数的常量特性限制了这种场景。因此,使用Point是最直接且高效的解决方案。
内容的提问来源于stack exchange,提问作者AlexYu
相关产品推荐
相关产品推荐

