2013-09-24 8 views
6

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?

+0

Quale @Mixin? 'groovy.lang.Mixin' o' grails.util.Mixin'? Prova a usare l'altro se è un mixin groovy. – dmahapatro

+0

Ho provato entrambi. Né l'uno né l'altro hanno funzionato. – aiolos

+0

@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

risposta

2

Avevo eseguito regolarmente lo stesso MissingMethodException quando seguivo uno schema di riutilizzo del codice simile utilizzando i mixin.

Nel mio caso, cambiando groovy.lang.Mixin a grails.util.Mixin (o più precisamente, l'aggiunta di un'importazione per grails.util.Mixin al mio controller) risolto completamente il problema.

Per non avere accesso alle variabili del controller, è possibile che si blocchi bloccando l'attesa di GRAILS-9905. Devo notare che ci sono alcuni suggerimenti sul funzionamento elencati nella discussione sui difetti, però.

+1

Non ho idea del perché, ma questo non funziona. Ho provato entrambe le annotazioni '@ Mixin' con import e senza:/ – Opal

1

La soluzione che alla fine ha funzionato per me è stato quello di iniettare manualmente il Mixin nel costruttore Controller:

import com.example.MyMixin 

class SomethingController { 
    def SomethingController() { 
    SomethingController.metaClass.mixin(MyMixin) 
    } 
} 
+0

Purtroppo anche questo non funziona con Grails v. 2.3.7 o forse mi manca qualcosa. Davvero fastidioso. – Opal

+0

@Opal Sono bloccato utilizzando 2.2.4. Non sono sicuro, ma forse puoi fare 'SomethingController.mixin MyMixin' direttamente (senza' metaClass'). Fondamentalmente vuoi un [runtime mixin] (http://groovy.codehaus.org/Runtime+mixins). – grammar31

+0

@ grammar31 Ha funzionato per me, io uso Grails 2.3.11. Grazie per questa risposta. –

Problemi correlati