tutorial example español ejemplos spring grails groovy

example - grails vs spring



El método getSomething(int i) de Grails no compila (5)

Antes de responder a la pregunta, déjame decirte mi entorno:
Grails 1.0.4
Java 1.6.0_10-beta
Groovy 1.6-RC-1
en una máquina con Windows Vista

En grails, los métodos de obtención dinámica se agregan en el tiempo de ejecución para todos los campos en la clase de dominio. Para la clase Person mencionada en la pregunta, se agregaría un método getName () en el tiempo de ejecución que permitiría a uno usarlo sin definirlo. Ahora el problema, con getSomething (int i) es que no tienes un campo llamado String algo en tu clase. Si intenta agregar un método llamado getName (int i), funcionaría sin problemas o si agrega un campo String algo, entonces el método getSomething () funcionaría.

Espero que esto resuelva el problema por el momento ... Seguiría buscando y publicando actualizaciones sobre el trabajo exacto pronto.

¿Puede alguien decirme por qué esta clase de dominio Grails no se compilará (en tiempo de ejecución)?

class Person { String name String getSomething(int i) { } }

Recibo este error cuando corro con grails run-app :

2008-12-27 15:26:33.955::WARN: Failed startup of context org.mortbay.jetty.webapp.WebAppContext@187e184{/asrs2,C:/Steve/asrs2/web-app} org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''pluginManager'' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NullPointerException at java.security.AccessController.doPrivileged(Native Method) at RunApp_groovy$_run_closure2_closure7.doCall(RunApp_groovy:67) at RunApp_groovy$_run_closure2_closure7.doCall(RunApp_groovy) at Init_groovy$_run_closure6.doCall(Init_groovy:131) at RunApp_groovy$_run_closure2.doCall(RunApp_groovy:66) at RunApp_groovy$_run_closure2.doCall(RunApp_groovy) at RunApp_groovy$_run_closure1.doCall(RunApp_groovy:57) at RunApp_groovy$_run_closure1.doCall(RunApp_groovy) at gant.Gant.dispatch(Gant.groovy:271) at gant.Gant.this$2$dispatch(Gant.groovy) at gant.Gant.invokeMethod(Gant.groovy) at gant.Gant.processTargets(Gant.groovy:436) at gant.Gant.processArgs(Gant.groovy:372) Caused by: java.lang.NullPointerException at java.lang.Class.isAssignableFrom(Native Method) ... 13 more

Si cambio el método getSomething to getSomething entonces funciona. ¿Es getSomething(int i) alguna manera tratado como un método de bean?

Seguimiento : este es un error de Grails que se solucionará en 1.2.


En lugar de definir que el método tiene un tipo de devolución, intente simplemente usar def :

class Person { String name def getSomething(int i) { // foo } }

Otra solución podría ser definir something como transitorio (siempre que no tenga realmente una propiedad llamada ''algo''):

class Person { String name static transients = [''something''] String getSomething(int i) { // foo } }


Un par de notas ...

  • Si proporciona un colocador, no es necesario que proporcione un captador. Y viceversa. Lo que realmente está haciendo es anular los métodos de acceso predeterminados que Groovy está adjuntando para usted. Puede anular una y no la otra si lo desea.
  • No hay problema si usted hace un método en su clase de dominio comenzando con ''buscar'' porque los métodos de buscador dinámico son en realidad adiciones de métodos estáticos (y todos comienzan con ''findBy *'').
  • La solución transitoria no funcionará. Hacer que ''algo'' sea un valor transitorio no ayuda al hecho de que tienes un getter con una firma de parámetro incorrecta. Lo mismo cuando escribe dinámicamente el valor de retorno.
  • Esto no es problema para Groovy, sino para Grails.

Creo que la solución es cambiar el nombre de tu método de getSomething a findSomething o lo que quieras que no vaya en contra de la convención. Lo siguiente funciona bien:

class Person { String name String findSomething(int i) { } }


Bueno, tienes dos problemas:

  1. Las clases de dominio en Grails intentan asegurarse de que cada propiedad tenga un getter y un setter durante el inicio. Lo hace buscando todos los captadores y asegurándose de que exista un colocador apropiado. Por lo tanto, si tiene un getSomething (), debe tener un setSomething (def algo), incluso si no hay una propiedad "algo" en la clase . En realidad, al crear la función getSomething (), implica que hay tal propiedad, y también debe crear un setSomething ().

  2. Los Getters no toman argumentos . La tuya lo hace. Ahora me doy cuenta de que no pensabas que esto era un "getter" cuando lo escribiste, pero tu nombre lo convierte en uno.

¿Mejor apuesta? No use los prefijos "get" o "set" o "is" a menos que realmente esté haciendo una propiedad completa que pueda obtenerse y establecerse. También evitaría "encontrar" en las clases de dominio, ya que tiene su propio conjunto de métodos generados.


Concluí que este es un error con Grails. Creé GRAILS-3760, que se ha corregido en Grails 1.1.2.