spring - @PostConstruct 在 Grails 服务上默默失败

标签 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())
    }
}

最佳答案

尝试将其更改为

@PostConstruct
void init() {

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

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

static lazyInit = false

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

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

def emailJobSchedulerService

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

关于spring - @PostConstruct 在 Grails 服务上默默失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14832002/

相关文章:

java - 使用 Java 配置的 N 层 Web 应用程序中的 Spring 上下文

java - org.codehaus.jackson.map.exc.UnrecognizedPropertyException : Unrecognized field "id" (Class Criteria), 未标记为可忽略

Javascript 和 Java 日期 JSON 序列化

java - .sql 文件中应包含冒号

grails - 通过内容分发网络使资源陷入困境:如何避免内容混合?

jquery - 在Grails日期中将JSON解码到Groovy

Spring Boot 和 MVC : How to set default value for @RequestBody object fields from application. 属性?

java - 如何在 Spring + Hibernate + Spring Security 表中填充外键

grails - 在grails中向web.xml添加过滤器

java - 用于命名要通过反射读取的类的注释