2016-08-22 8 views
1

私の簡単なドメインクラス:地図を破壊する

class TestDestroy { 
    String x 
} 

とサービス:

class TestDestroyService implements DisposableBean { 
    @Override 
    void destroy() throws Exception { 
     TestDestroy d = new TestDestroy(x: "x") 
     println("Test destroy: ${d.x}") 
    } 
} 

私が呼び出した場合、コントローラのすべてのものからdestroy()方法で結構です、私は出力を得ます:

Test destroy: x 

destroyがapp shで呼び出されると問題が発生します

2016-08-22 11:20:14.186:INFO:t.1:Destroying Spring FrameworkServlet 'grails' 
Test destroy: null 
2016-08-22 11:20:14.487:INFO:t.1:Closing Spring root WebApplicationContext 
2016-08-22 11:20:14.496:INFO:oejsh.ContextHandler:stopped o.e.j.w.WebAppContext{ ... 

これはドメインクラスでのみ発生します。これは、他のGroovyクラスでは、コンストラクタが正しく動作するためです。私がsetterでプロパティを設定すると、それは機能します。

マップコンストラクタでドメインクラスを使用し、destroy()

セットアップから呼び出されたコードのためのその一般的に危険な:あなたは、ブートストラップ法はINITのGrailsを使用して破壊しないのはなぜ

groovy 2.4.4 
hibernate4 4.3.6.1 
jetty 8.1.9 

答えて

0

def init = { 
    //init code here 
} 

def destroy = { 
//destroy code here 
} 

任意のアクションを実行することができます。また、コードを破棄してseggregateしたい場合は、サービスを作成して呼び出してください。

+0

destroyメソッドが実行されるため、ブートストラップから呼び出す必要はありません。 DisposableBeanの 'destroy()'コールバックメソッドは、読みやすく、春の正常なシャットダウンを実装する標準的な方法です。問題は、groovyのMapコンストラクタが破棄後に機能しないことです。 –