2017-10-26 17 views
0

Closureを含むBean定義を持つことは可能ですか?時には、私はクラスのインスタンスをほぼ同じにしたいと思っていましたが、小さな動作では区別されていました。データよりも、私のbean定義で異なるフィールドを渡すだけでは不十分です。grails bean定義を使用してSpring Beanにクロージャを渡す

例希望Bean定義:

beans { 
    myCustomWidget1(Widget) { 
     myClosure = { w -> return w.doThis() } 
    } 

    myCustomWidget2(Widget) { 
     myClosure = { w -> return w.doThat() } 
    } 
} 

例クラス:

class Widget { 
    Closure myClosure 

    ... 
} 

問題は、Anonymous (Inner) Beansはすでに閉鎖構文を使用し、これらの匿名の豆は、アプリケーションの起動時に評価されることですクラスのClosureフィールドを設定するのではなく、これにより、実行時に例外が発生することは明らかです。

これまでは、私が自分のbeanに注入する小さなヘルパークラスを作成していましたが、振る舞いの変更は同じ名前のメソッドとして記述されています。私はこれが正しいアプローチだと信じていますが、私はより簡潔な「グルーヴィー」な方法を望んでいました。

Grails 2.4.2を使用していますが、grails/groovyのバージョンにかかわらず、BeanBuilderは匿名のBeanとして私の望むClosureを扱うと思います。それを行うには

答えて

1

一つの方法は...この代わりにこれを試してみてください

beans { 
    myCustomWidget1(Widget) { 
     myClosure = { w -> return w.doThis() } 
    } 

    myCustomWidget2(Widget) { 
     myClosure = { w -> return w.doThat() } 
    } 
} 

...私が探していただけで何

beans { 
    myCustomWidget1(Widget) { bean -> 
     bean.setPropertyValue 'myClosure', { w -> return w.doThis() } 
    } 

    myCustomWidget2(Widget) { bean -> 
     bean.setPropertyValue 'myClosure', { w -> return w.doThat() } 
    } 
} 
+0

です、ありがとう! – tylerwal

関連する問題