首页 > 解决方案 > 尝试使用 @Value 从属性文件设置 @Scheduled 的 cron 属性,但出现编译时错误

问题描述

我一直在尝试将@Scheduled 的 cron 属性设置如下。

public class ObjectScheduler {
  @Value("${config.cron.expression}")
  private static final CRON_EXPRESSION;

  @Scheduled(cron = CRON_EXPRESSION, zone="GMT")
  public void scheduledObjectFetch() {...}
}

我在这里遇到编译时错误说

The value for the annotation attribute Scheduled.cron attribute must be a constant expression.

如果我直接在属性中给出表达式,同样的事情

@Scheduled(cron = "${config.cron.expression}", zone="GMT")

这里的值也是在运行时从配置中分配的,那么为什么它不在这里给出编译时错误呢?为什么当我使用 @Value 注释将它分配给一个变量时,它不认为它是一个常量表达式?有什么我想念的吗?是因为 Java 还是 Spring 的 @Value 注解?

标签: javaspringcronspring-scheduled

解决方案


@Value尽管可以通过 setter 完成,但 Spring 不会插入静态字段。

这也适用于static final需要在编译时定义的字段。

所以你不能通过配置CRON_EXPRESSION@Value它只有在你设置硬编码的情况下才能工作:

private static final String CRON_EXPRESSION = "0 0 8 * * ?";

@Scheduled(cron = CRON_EXPRESSION, zone="GMT")
  public void scheduledObjectFetch() {...}

推荐阅读