@PostConstruct在Grails服务上静默失败

时间:2013-02-12 11:55:34

标签: spring grails annotations postconstruct

我认为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())
    }
}

2 个答案:

答案 0 :(得分:16)

尝试将其更改为

@PostConstruct
void init() {

(即void代替def)。我不确定Spring是否专门强制执行此操作,但specification of @PostConstruct表示“方法的返回类型必须无效”。

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

static lazyInit = false

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

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

将服务注入BootStrap
def emailJobSchedulerService

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

答案 1 :(得分:1)

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

@PostConstruct
private void init() {

这也无声地失败并且表现出奇怪的行为。解决方案是删除" private":

@PostConstruct
void init() {
相关问题