Pertanyaan grails mengesampingkan metode pengontrol pengalihan


Saya mencoba mengganti metode pengalihan pengendali default dan sepertinya tidak mendapatkan sedikit kode berikut untuk bekerja.

Saya telah membuat sebuah plugin dan saya mencoba menggunakan "doWithDynamicMethods" untuk mengganti pengalihan.

def doWithDynamicMethods = {ctx ->
   application.controllerClasses.each() { controllerClass ->
      replaceRedirectMethod(controllerClass)
   }
}

void replaceRedirectMethod(controllerClass) {
   def oldRedirect = controllerClass.metaClass.pickMethod("redirect", [Map] as Class[])
   controllerClass.metaClass.redirect = { Map args, Map params ->
      // never seems to get here    
   }
}

Apakah saya memiliki tanda tangan yang salah atau saya kehilangan sesuatu? Alasan saya melakukan ini adalah saya ingin mengubah uri redirect jika kondisi tertentu terpenuhi tetapi dengan logging / print statement Saya melihat bahwa ini akan di "replaceRedirectMethod" setelah startup aplikasi / kompilasi tetapi tidak masuk ke sana ketika melakukan pengalihan melalui pengontrol setelah aplikasi dijalankan.


5
2018-03-15 19:11


asal


Jawaban:


Ya, tanda tangan salah - redirect mengambil satu Map parameter (lihat deklarasi di org.codehaus.groovy.grails.plugins.web.ControllersGrailsPlugin.registerControllerMethods())

Jadi seharusnya begitu

controllerClass.metaClass.redirect = { Map args ->
   // pre-redirect logic
   oldRedirect.invoke delegate, args
   // post-redirect logic
}

3
2018-03-16 03:42



Juga perhatikan bahwa jika Anda menginginkan redirect penggantian metode yang akan diterapkan kembali setelah memodifikasi kode sumber dari pengontrol, Anda perlu melakukan hal berikut:

def watchedResources = [
  "file:./grails-app/controllers/**/*Controller.groovy"]

def onChange = { event ->
  if(!(event.source instanceof Class)) return

  if(application.isArtefactOfType(ControllerArtefactHandler.TYPE, event.source))
  {
    replaceRedirectMethod(application.getArtefact(ControllerArtefactHandler.TYPE,
                                                  event.source.name))
  }
}

0
2017-09-03 20:59