2013-02-12 41 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() { 
相關問題