我认为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())
}
}
答案 0 :(得分:16)
尝试将其更改为
@PostConstruct
void init() {
(即void
代替def
)。我不确定Spring是否专门强制执行此操作,但specification of @PostConstruct
表示“方法的返回类型必须无效”。
编辑:uchamp的评论是正确的,我只是尝试了相同的测试,实际上只在第一次使用服务bean时调用@PostConstruct
带注释的方法,而不一定在启动时立即调用。你可以添加
static lazyInit = false
到服务类以强制它在启动时急切地初始化。这似乎没有在用户指南中记录,我通过reading the code推断出来。
请注意,前一段中的“used”并不一定意味着您必须在其上调用方法。服务bean将在第一次从应用程序上下文中直接获取时初始化,或者因为它已被自动连接到另一个正在初始化的bean中。例如,使用
将服务注入BootStrapdef emailJobSchedulerService
足以触发@PostConstruct
方法,您不必实际调用BootStrap.init
闭包中的任何服务方法。同样,如果您的服务被注入任何控制器,那么init会在其中一个控制器第一次处理请求时触发(任何请求,它不一定是调用服务的动作)。
答案 1 :(得分:1)
只需添加来自@Ian的答案 - 出于某种原因,我有:
@PostConstruct
private void init() {
这也无声地失败并且表现出奇怪的行为。解决方案是删除" private":
@PostConstruct
void init() {