1

イベントごとに platform-core-1.0 rc5 Plugin をサービスに試してみました。ここで、grails-plugin "listadmin" にサービスを記述します。

package listadmin

class SECO_ListenService {

    @grails.events.Listener(topic='getEntriesOfList', namespace='listadmin')
    def getEntriesOfList(String intnalListName) {
        println "SECO_ListenService"
        def Liste aList = Liste.findByInternal_name(intnalListName)
        return aList.eintrage.toList()
    }
}

このサービスは、「institutionadmin」と呼ばれる別の grails プラグインのドロップダウン リストを返す必要があります。このサービスのリストをドメイン モデルのドロップダウンに使用したいと考えています。私は動的な足場を使用していることに言及する必要があります。ここで、ドメイン モデルでこのイベントを呼び出そうとします。

package institutionadmin
import org.springframework.dao.DataIntegrityViolationException
class Einrichtung {

    Long einrichtungs_type
    Long type_of_conzept
    int anzahl_gruppen
    int anzahl_kinder_pro_Gruppe
    String offnungszeiten
    static hasMany = [rooms : Raum]
    static constraints = {
        def aList = []
        def reply = event(for:"listadmin", topic:"getEntriesOfList", data:"einrichtung_type").waitFor()

        aList = reply.value.toList()
        einrichtungs_type(inList: aList)
    }
}

このアプリケーションを実行しようとすると、次のエラーが発生します。

MissingMethodException が原因: メソッドのシグネチャがありません: 機関管理者.Einrichtung.event() は引数の型に適用できます: (java.util.LinkedHashMap) 値: [[for:listadmin, topic:testEventBus]] 可能な解決策: ident(), every ()、every(groovy.lang.Closure)、count()、get(java.io.Serializable)、print(java.lang.Object)

コントローラーでこのイベントを呼び出すと、すべて問題なく、このプラグインのドキュメントには、ドメインモデルとサービスでもイベントを呼び出すことができると記載されています...このエラーメソッドは、クラスがイベントメソッドを知らないことを教えてくれます。

他に何か設定する必要がありますか?

イベントを別の方法で呼び出す必要がありますか、それとも私の間違いはどこですか?

このモジュールを使用した経験のある人はいますか?

4

2 に答える 2

3

動的メソッドは、event(...)クラス (静的) レベルでは使用できません。

grailsEventsSpring Bean をプルして、event()代わりにそのメソッドを呼び出すことができます。ただし、アプリケーション コンテキストから Bean を静的に取得する必要があります。

現在のドメインインスタンスをパラメーターとして取得できるため、代わりにカスタムバリデーターを使用することもできます。これにはevent()メソッドが注入されている必要があります。

このようなもの :

static myList = []
static constraints = {
    einrichtungs_type validator: { value, instance ->
        if(!myList){
            // cache it the first time you save/validate the domain
            // I would probably recommend you NOT to do this here though in 
            // real life scenario
            def reply = instance.event('blabla').get()
            myList = reply.value.toList()
        }

        return value in myList
    }
}

とにかく、私の場合Bootstrap.groovy、制約クロージャで行う代わりに、おそらくリストを別の場所(たとえば)にロードして、それを使用/ドメインに挿入します。

于 2013-05-29T13:38:21.207 に答える