2013-02-12 39 views
7

我认为Spring注解应该在Grails环境中开箱即用,但我根本无法使它工作。我也尝试了afterProperties方法,它也没有工作。@PostConstruct在Grails服务上无提示失败

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

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()) 
    } 
} 
+0

到位把注释很大的制约(见http://docs.oracle.com/javase/7/docs/api/javax/annotation/PostConstruct.html )。他们都适用? – lucke84 2013-02-12 13:03:08

+0

@ lucke84根据Ian的建议将其更改为无效后,我应遵守所有约束条件 – willcodejavaforfood 2013-02-12 13:09:10

+4

您希望何时打印cronExpression?在服务器启动?我相信这是在第一次调用任何服务的方法时调用的,而不是在服务器启动时调用的。我建议在bootstrap中调用一个虚拟方法来确认。 – uchamp 2013-02-12 14:14:22

回答

14

尝试改变到

@PostConstruct 
void init() { 

(即的代替voiddef)。我不确定Spring是否特别强制执行此操作,但specification of @PostConstruct指出除其他外“该方法的返回类型必须为空”。

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

static lazyInit = false 

添加到服务类,以强制它在启动时被初始化。这似乎没有记录在用户指南中,我推测它由reading the code

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

def emailJobSchedulerService 

就足以火@PostConstruct方法注射服务为自举,你不必实际从BootStrap.init关闭调用任何服务的方法。同样,如果你的服务被注入到任何控制器中,init会在第一次有一个控制器处理请求时触发(任何请求,它不一定是调用服务的动作)。

+0

还是什么都没有。欣赏努力虽然:) – willcodejavaforfood 2013-02-12 12:45:52

+1

@willcodejavaforfood假设问题的'.groovy'文件在'grails-app/services'而不是'src/groovy'那么它应该工作。我多次使用过相同的技巧。有一点需要注意的是,GORM可能在'@ PostConstruct'时候不可用。如果您需要使用GORM方法做任何事情,您可能需要定义一个正常的未注释的方法,并从BootStrap中调用它。 – 2013-02-12 12:58:43

+0

这很奇怪。即使只使用命令行创建了一个全新的项目,@PostConstruct也没有在那里调用。我不需要为此使用GORM,只是安排我未完成的工作。 – willcodejavaforfood 2013-02-12 14:03:52

1

只是增加从@Ian了答案 - 出于某种原因,我有:

@PostConstruct 
private void init() { 

这也失败了默默给了奇怪的行为。解决方案是消除“私”:

@PostConstruct 
void init() { 
相关问题