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

SpringBoot中如何动态设置@Measurement的名称?

动态指定InfluxDB2 Measurement名称的正确实现方式

问题原因

@Measurement注解的name参数要求是编译时常量,无法通过EL表达式#{measurementName}动态绑定POJO运行时的字段值,所以你会看到写入的measurement名称是字面字符串#{measurementName}。

解决方案:使用Point对象动态构建数据

InfluxDB Java Client提供了Point类来灵活构建写入数据,完全支持动态指定measurement名称,适配你的场景。

修改后的代码:

  1. 调整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;
    }
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:52:21