2010-01-11 13 views
6

Soy un novato de los griales (y un principiante maravilloso), y estoy trabajando en algunos tutoriales de grails. Como nuevo usuario, el shell de Grails es una pequeña herramienta realmente útil para mí, pero no puedo entender cómo hacer que vea mis clases y objetos. Esto es lo que estoy tratando:Concha de Grails que no ve los objetos de dominio

% grails create-app test 
% cd test 
% grails create-domain-class com.test.TestObj 
% grails shell 
groovy:000> new TestObj() 
ERROR org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed, groovysh_evaluate: 2: unable to resolve class TestObj 

Yo tenía la impresión de que la cáscara griales podía ver todos los controladores, servicios y objetos de dominio. ¿Qué pasa con esto? ¿Debo hacer algo más aquí?

he intentado otra cosa:

groovy:000> foo = new com.test.TestObj(); 
===> com.test.TestObj : null 
groovy:000> foo.save 
ERROR groovy.lang.MissingPropertyException: No such property: save for class: com.test.TestObj 

¿Qué estoy haciendo mal?

EDITAR: Bien, vi las respuestas sobre el uso del nombre completo y también el uso de .save() en lugar de .save. Pero, ¿y este?

groovy:000> new com.test.TestObj().save() 
ERROR org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here 

¿Qué hice mal esta vez?

Respuesta

2

Me segundo consejo de Burt utilizar la consola en lugar de la cáscara. En cuanto a la excepción:

groovy:000> new com.test.TestObj().save() 
ERROR org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here 

Puede usted intente ejecutar de forma explícita este código con una transacción:

import com.test.TestObj 

TestObj.withTransaction{ status -> 
    TestObj().save() 
} 
+0

Sí, withTransaction funciona perfectamente. Me pregunto por qué necesito agregar eso. Los ejemplos en línea no parecen mencionarlo. –

+0

No debería necesitar agregar eso, pero pensé que podría resolver su problema. AL ejecutar su código dentro de una transacción, forzará la creación de una sesión de hibernación (que de otro modo faltaría). –

2

se necesita el paquete, ya que es posible (pero no es una buena idea) que tiene dos clases de dominio con el mismo nombre en diferentes paquetes.

Para la segunda sesión que debería ser foo.save(), no foo.save.

Prefiero la consola, es mucho más fácil trabajar con ella. Ejecute 'Grails Console' y se iniciará la aplicación Swing. Es un poco diferente de la consola regular de Groovy en que tiene una variable implícita 'ctx' disponible que es el contexto de la aplicación Spring. Puede usar eso para acceder a los servicios y otros beans de primavera a través de "ctx.getBean ('fooService')"

+0

Gracias, un buen consejo! PD Tengo una pregunta más, save() produce una excepción Hibernate. Sugerencias? –

+0

Además, "ctx" también parece estar disponible en mi shell. Tal vez lo agregaron en 1.2? –

1

tendrá que import com.test.TestObj o consultarlo por new com.test.TestObj() como lo ha demostrado.

Tenga en cuenta que 'save' no es una propiedad, sino un método dinámico que Grails decora con la clase de dominio en tiempo de ejecución.

groovy:000> foo = new com.test.TestObj(); 
===> com.test.TestObj : null 
groovy:000> foo.save() 
===> com.test.TestObj : 2 
groovy:000> 
+1

Ahhh, yo sabía que era un método de ahorro, pero estoy bastante nueva Groovy no saber que no puedo llamar a un método sin paréntesis :) ¿Sabe lo que pasa con la excepción sesión de Hibernate que estoy viendo ¿ahora? –

Cuestiones relacionadas