8

我认为 Spring 注释应该在 Grails 环境中开箱即用,但我根本无法让它工作。我还尝试了 afterProperties 方法,它也不起作用。

任何人都可以发现错误吗?我需要做一些配置吗?

package dashboard

import javax.annotation.PostConstruct

class EmailJobSchedulerService
{
    def grailsApplication

    @PostConstruct
    def init() {
        def cronExpression = grailsApplication.config.emailAt8AmTrigger
        println(cronExpression)
        EmailSubscribersJob.schedule(cronExpression, new HashMap())
    }
}
4

2 回答 2

17

尝试将其更改为

@PostConstruct
void init() {

(即void代替def)。我不确定 Spring 是否专门强制执行此操作,但规范中@PostConstruct指出“方法的返回类型必须为 void”。

编辑:uchamp 的评论是正确的,我只是尝试了相同的测试,并且确实@PostConstruct只在第一次使用服务 bean 时调用了带注释的方法,并且不一定在启动时立即调用。你可以加

static lazyInit = false

到服务类以强制它在启动时急切地初始化。这似乎没有记录在用户指南中,我是通过阅读代码推断出来的

请注意,上一段中的“使用”并不一定意味着您必须在其上调用方法。服务 bean 将在第一次从应用程序上下文中获取时被初始化,无论是直接还是因为它已自动装配到另一个正在初始化的 bean 中。例如,将服务注入 BootStrap 使用

def emailJobSchedulerService

足以触发该@PostConstruct方法,您不必从BootStrap.init闭包中实际调用任何服务的方法。同样,如果您的服务被注入任何控制器,那么 init 将在其中一个控制器第一次处理请求时触发(任何请求,它不必是调用服务的操作)。

于 2013-02-12T12:02:28.937 回答
2

只需添加@Ian 的答案-出于某种原因,我有:

@PostConstruct
private void init() {

这也默默地失败并给出了奇怪的行为。解决方案是删除“私人”:

@PostConstruct
void init() {
于 2014-09-25T11:53:59.477 回答