Domanda

Sto cercando di intercettare una chiamata di metodo (dopoinserimento() di un dominio di classe) in un Grails applicazione.In doWithDynamicMethods chiusura del mio plugin che ho:

for (dc in application.domainClasses) {
    // What I'm basically doing is renaming method A to B
    // and creating a new method A with its own business logic
    // and a call to B() at the end

    def domainClass = dc.getClazz()
    def oldAfterInsert = domainClass.metaClass.afterInsert
    domainClass.metaClass."afterInsert_old" = oldAfterInsert

    dc.metaClass.afterInsert = {
        // New afterInsert() logic here

        // Call the old after insert
        delegate.afterInsert_old()
    }

}

Ma poi ottengo questo errore:

No signature of method: static com.example.afterInsert_old() is applicable for argument types: () values: []

Ho anche provato a chiamare con la dc.metaClass."afterInsert_old".invoke(delegato, new Object[0]) ma poi mi esce:

Caused by: groovy.lang.MissingMethodException: No signature of method: groovy.lang.ExpandoMetaClass$ExpandoMetaProperty.invoke() is applicable for argument types: (com.example.DomainName, [Ljava.lang.Object;) values: [com.example.DomainName : 115, []]

Che cosa sto facendo di sbagliato?Come posso chiamare un metodo che non accetta argomenti?

Conosco AOP e ho visto l'Grails la Registrazione di Controllo del plugin, ad esempio.Tuttavia, ciò che fa è, per quanto ne so, aggiungi nuovo utente creato metodi che essere attivata al momento giusto.Voglio iniettare il mio codice automaticamente, in modo che l'utente non deve preoccuparsi di nulla e non voglio distruggere la sua originale dopoinserimento() (o qualunque sia il metodo che è) di attuazione.

Inoltre, mi piacerebbe fare lo stesso per il servizio esposto i metodi in modo da infondere sicurezza in loro.Tuttavia, da quello che ho letto che potrebbe non funzionare a causa della BeanWrapper e perché i servizi sono sempre ricaricato.Qualcuno può spiegare meglio di me?

Grazie in anticipo.

È stato utile?

Soluzione

Non credo che avete bisogno di rinominare il vecchio metodo.Si potrebbe fare come in questo esempio:

for (dc in application.domainClasses) {
    // What I'm basically doing is renaming method A to B
    // and creating a new method A with its own business logic
    // and a call to B() at the end
    def domainClass = dc.getClazz()
    def savedAfterInsert = domainClass.metaClass.getMetaMethod('afterInsert', [] as Class[])
    domainClass.metaClass.afterInsert = {
        // New afterInsert() logic here

        // Call the old after insert
        savedAfterInsert.invoke(delegate)
    }

}

Basta fare in modo che il getMetaMethod restituisce il metodo corretto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top