All'interno del mio ultimo progetto Grails 2.3.0 sto usando l'annotazione @Mixin
per mixin una classe helper per mantenere il mio controller
più DRY.Controller @Mixin funziona solo dopo aver ricompilato l'app in esecuzione
Il mixin funziona solo se sono state apportate alcune modifiche all'interno del controller per forzare una ricompilazione del controller. Dopo la compilazione iniziale (grails run-app
) l'helper non è stato mixato - Ricevo un MissingMethodException
cercando di accedere a un metodo dalla classe helper.
Qui è il mio aiuto witin src/groovy
:
class ProjectHelper {
def withProject(id, Closure c) {
def project = Project.get(id)
if (project) {
c.call project
} else {
flash.message = 'Project not found!'
render view: 'myView'
return
}
}
}
E (una delle) controller
che utilizza il ProjectHelper
:
@Mixin(ProjectHelper)
class ProjectController {
def index() {
withProject params.projectId, {project ->
// do something with the project
}
}
}
Quando ho cleane il progetto con grails clean
e avviare l'applicazione, ho ottenere il seguente errore dopo l'accesso a project/index
:
MissingMethodException occurred when processing request:
[GET] /<myApp>/project/
No signature of method: <myPackage>.withProject() is applicable for argument types:
(java.lang.String, <myPackage>.ProjectController$_index_closure1_closure10) values:
[1, <myPackage>[email protected]]
Dopo alcune modifiche in ReportController
(ad es. aggiungendo un singolo spazio) grails compila 2 file sorgente e il metodo withProject
può essere utilizzato. L'accesso a project/index
funziona come previsto.
Cosa non va qui? È un bug o mi manca qualcosa?
Aggiornamento
Si scopre che ho completamente perso, che l'utilizzo del grails.util.Mixin
mi dà un'altra eccezione (MissingPropertyException
) a causa della mancanza di accesso al misto in proprietà di classe (nel mio caso: flash
) (vedi JIRA this issue) che funziona con groovy.lang.Mixin
(dopo la ricompilazione).
C'è un modo per ricompilare/iniettare/mixare manualmente il groovy.lang.Mixin
in fase di esecuzione o devo trovare un'altra gestione degli errori per la parte else
fino a quando il problema è stato risolto?
Qualche suggerimento?
Quale @Mixin? 'groovy.lang.Mixin' o' grails.util.Mixin'? Prova a usare l'altro se è un mixin groovy. – dmahapatro
Ho provato entrambi. Né l'uno né l'altro hanno funzionato. – aiolos
@dmahapatro Ho controllato di nuovo! Era un po 'tardi ieri - mi mancava quel grails.util.Mixin dà un'altra eccezione. Aggiornerò la mia domanda ... – aiolos