@PostConstruct молча терпит неудачу на Сервисе Grails

Я думал, что аннотации 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 ответа

Решение

Попробуйте изменить это на

@PostConstruct
void init() {

(т.е. void вместо def). Я не уверен, что Spring специально обеспечивает это, но спецификация@PostConstruct утверждает, что среди прочего "Возвращаемый тип метода ДОЛЖЕН быть недействительным".

Редактировать: комментарий Учампа правильный, я только что попробовал тот же тест и действительно @PostConstruct аннотированный метод вызывается только при первом использовании служебного компонента и не обязательно сразу при запуске. Можете добавить

static lazyInit = false

к классу обслуживания, чтобы принудительно инициализировать его при запуске. Похоже, что это не задокументировано в руководстве пользователя, я вывел его, прочитав код.

Обратите внимание, что "используемый" в предыдущем абзаце не обязательно означает, что вы должны вызывать метод для него. Служебный компонент будет инициализирован при первом извлечении из контекста приложения, либо напрямую, либо потому, что он был автоматически подключен к другому инициализируемому компоненту. Например, внедрение службы в BootStrap с помощью

def emailJobSchedulerService

было бы достаточно, чтобы уволить @PostConstruct метод, вам не нужно вызывать какие-либо методы службы из BootStrap.init закрытие. Точно так же, если ваша служба была внедрена в какие-либо контроллеры, тогда init запустил бы первый раз, когда один из этих контроллеров обработал запрос (любой запрос, это не должно быть действие, которое вызывает службу).

Просто добавляю ответ от @Ian - По какой-то причине у меня было:

@PostConstruct
private void init() {

Это также молча провалилось и дало странное поведение. Решением было убрать "приват":

@PostConstruct
void init() {
Другие вопросы по тегам