grails controller traits

@ Mejora el controlador Grails



controller traits (2)

Hay una solución más que no necesita que cree un conjunto fuente adicional personalizado.

El complemento grails gradle viene de forma predeterminada con un conjunto de fuentes llamado ast que se compila antes de cualquier fuente principal. para que pueda poner su conjunto de orígenes Trait in ast y eso se aplicará a artefactos incluso en el mismo plugin / proyecto.

Así es como debe ser la estructura de su proyecto

src + +--+ast + +--+groovy + +--+MyAwsomeTrait.groovy

Y esto se compilará antes de las clases en src / main sourceset y grails seleccionará su fuente y la aplicará.

actualización: Grails configura el conjunto de orígenes ast solo para proyectos de complementos y no aplicaciones. Aquí escribí una entrada de blog sobre cómo crear un conjunto de orígenes AST para aplicaciones

Tengo un Rasgo definido así:

@Enhances(ControllerArtefactHandler.TYPE) trait NullCheckTrait { def nullCheck(def object) { // code here } }

Cuando llamo a nullCheck(foo) desde mi controlador, obtengo la excepción No signature of method . Si implements NullCheckTrait en el controlador, funciona bien. He leído que @Enhances solo funcionará si creo un plugin de Grails y coloco el rasgo allí. Tengo curiosidad por saber si esto es un problema conocido y si hay una forma de que @Enhances funcione desde la misma aplicación de grial que el controlador.


No, no hay forma de evitar esto, ya que @Enhances clases @Enhances deben estar en el classpath antes de la compilación. Por ejemplo, supongamos que su clase de controlador se compila primero y luego su rasgo, entonces el rasgo no se aplicará, y dado que no hay forma de controlar el orden de compilación, esto seguirá siendo un problema.

La única otra forma en que esto podría hacerse en el mismo proyecto es configurar un conjunto de fuentes adicional en Gradle, ver:

¿Cómo agrego un nuevo conjunto de orígenes a Gradle?