Frage

Ich versuche, einen Methodenaufruf (Afterinsert () eine Domain-Klasse) in einer Grails-Anwendung abzufangen. In doWithDynamicMethods Schließung mein Plugin habe ich:

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

}

Aber ich diesen Fehler dann bekommen:

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

Ich habe auch versucht, es mit dc.metaClass zu nennen "afterInsert_old" .invoke (Delegierter, new Object [0]), aber dann komme ich.

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, []]

Was mache ich falsch? Wie kann ich eine Methode aufrufen, die keine Argumente hat?

Ich weiß, über AOP und haben auch die Grails Audit Logging-Plugin als Beispiel zu sehen. Doch was sie tut, ist, soweit ich weiß, fügen Sie neue Benutzer erstellt Methoden, die zur richtigen Zeit ausgelöst werden. Ich möchte meinen Code injizieren automatisch, so dass der Benutzer nicht um nichts zu kümmern hat, und ich möchte nicht seine ursprüngliche Afterinsert () zerstören (oder was auch immer Methode, es ist) Umsetzung.

Auch ich möchte die gleiche für exponierte Service-Methoden einzuspritzen, um die Sicherheit in ihnen zu tun. Aber von dem, was ich gelesen habe, wäre es nicht wegen des BeanWrapper arbeiten und weil die Dienste immer neu geladen. Kann jemand dies besser mir das erklären?

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Ich glaube nicht, dass Sie die alte Methode umbenennen müssen. Man könnte es tun, wie in dieses Beispiel :

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

}

So stellen Sie sicher, dass die getMetaMethod die richtige Methode gibt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top