试图使用@Value从属性文件中设置@Scheduled的cron属性,但在编译时出现错误。

问题描述 投票:0回答:1

我一直在尝试设置@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注解?

java spring cron spring-scheduled
1个回答
1
投票

春天不会插入 @Value 变成静态字段,不过可以通过setter来实现。

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

所以你不能配置 CRON_EXPRESSION 通过 @Value只有当你把它设置为硬编码时,它才会工作。

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

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

0
投票

在你的例子中,你把这个字段设置为 final 最根本的原因是你不能用 "A "来向字段注入值。@value 是Java用实际的值来替换代码中静态的最终 "变量 "的出现(因为在编译时当然知道)。所以,如果你删除了 final 的限定词,它应该可以为你使用弹簧 setter 注入。您不能使用@value从属性文件中注入值到一个 static final 变量,这是因为java处理最终静态变量的方式。

理想情况下,我们可以使用 春风化雨 填充cron从 property 通过提供类似于.com的文件,来实现。

@Component("scheduledAnnotationObjectScheduler")
public class ObjectScheduler {
  @Scheduled(cron = "${cron.expression}")
  public void scheduledObjectFetch() {...}
}

应用程序.属性

cron.expression=0 15 10 15 * ?

这应该可以解决 cron 理论上来说,从属性文件中获取的值,因为它是在组件扫描过程中获取的。

© www.soinside.com 2019 - 2024. All rights reserved.