播放:使用配置属性作为注释的值

时间:2011-10-20 08:06:43

标签: java java-ee annotations playframework

这(显然)有效:

@Every("10s")
public class Extinguisher extends Job {
    ...
}

......但这不是:

@Every(Play.configuration.getProperty("my.setting", "10s"))
public class Extinguisher extends Job {
    ...
}

运行auto-test时,应用程序无法启动并抱怨我的控制器因javassist遇到NullPointerException而无法增强。

有没有办法从application.conf配置作业计划?

4 个答案:

答案 0 :(得分:4)

您可以从@OnApplicationStartup作业手动安排作业:

@OnApplicationStartup
public class ExtinguisherBootstrap extends Job { 
    public void doJob() {
        new Extinguisher()
            .every(Play.configuration.getProperty("my.setting", "10s"));
    }
}

答案 1 :(得分:3)

我不知道Play或javassist是否扩展了你可以用Java语言做的事情,但我至少可以指出以下行不是合法的Java:

@Every(Play.configuration.getProperty("my.setting", "10s"))

对于参数类型为 T 且值为 V 的注释,Java Language Specification要求:

  

如果 T 是基本类型或String,则 V 是常量表达式

在这种情况下, T (注释参数的类型)是String,但是您尝试设置的值不是(编译时) )常数表达。

答案 2 :(得分:2)

问题是“配置”在那个阶段不可用。

我不认为你想做什么是可能的(根据我目前对Play的了解,也许有人知道让它发挥作用的技巧)

您可以通过每隔几秒钟运行一次作业来“破解它”,并在该作业中按照配置启动目标作业。效率较低,但它可以解决您的问题

答案 3 :(得分:2)

您可以这样做:

@On("cron.noon")

在application.conf中会找到这样的一行:

cron.noon = 1s