8

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())
    }
}
4

2 に答える 2

17

に変更してみてください

@PostConstruct
void init() {

(つまりvoidの代わりにdef)。Spring がこれを明確に強制しているかどうかはわかりませんが、仕様に@PostConstructは、とりわけ「メソッドの戻り値の型は void でなければならない」と記載されています。

編集: uchamp のコメントは正しいです。同じテストを試してみたところ、実際に@PostConstruct注釈付きのメソッドが呼び出されるのは、サービス Bean が初めて使用されたときだけであり、必ずしも起動時にすぐに呼び出されるわけではありません。あなたは付け加えられます

static lazyInit = false

サービスクラスに追加して、起動時に強制的に初期化されるようにします。これはユーザー ガイドに記載されていないようです。コードを読んで推測しました。

前の段落の「使用」は、必ずしもメソッドを呼び出さなければならないという意味ではないことに注意してください。サービス Bean は、直接、または初期化中の別の Bean にオートワイヤーされているため、アプリケーション コンテキストから初めてフェッチされるときに初期化されます。たとえば、次を使用して BootStrap にサービスを挿入します。

def emailJobSchedulerService

メソッドを起動するには十分です。クロージャー@PostConstructからサービスのメソッドを実際に呼び出す必要はありません。BootStrap.init同様に、サービスが任意のコントローラーに挿入された場合、それらのコントローラーのいずれかが最初にリクエストを処理したときに init が起動します (任意のリクエスト、サービスを呼び出すアクションである必要はありません)。

于 2013-02-12T12:02:28.937 に答える
2

@Ianからの回答を追加するだけです-何らかの理由で私は持っていました:

@PostConstruct
private void init() {

これも黙って失敗し、奇妙な動作をしました。解決策は、「プライベート」を削除することでした:

@PostConstruct
void init() {
于 2014-09-25T11:53:59.477 に答える