Grails shell没有看到域对象

时间:2010-01-11 05:19:05

标签: grails groovy groovyshell

我是一个grails新手(和一个时髦的新手),我正在通过一些grails教程。作为一个新用户,grails shell对我来说是一个非常有用的小工具,但我无法弄清楚如何让它看到我的类和对象。这是我正在尝试的:

% 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

我的印象是grails shell可以看到所有控制器,服务和域对象。怎么了?我需要在这里做点什么吗?

我尝试了另外一件事:

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

我做错了什么?

编辑:好的,我看到了有关使用全名并使用.save()而不是.save的答案。但那个呢?

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

这次我做错了什么?

3 个答案:

答案 0 :(得分:2)

你需要这个包,因为在不同的包中有两个具有相同名称的域类是可能的(但不是一个好主意)。

对于第二个会话,它应该是foo.save(),而不是foo.save。

我更喜欢控制台,它更容易使用。运行'grails console',Swing应用程序将启动。它与常规的Groovy控制台略有不同,因为它有一个隐含的'ctx'变量,它是Spring应用程序的上下文。您可以使用它来通过“ctx.getBean('fooService')”访问服务和其他Spring bean“

答案 1 :(得分:2)

我是第二个Burt建议使用控制台而不是shell。关于例外:

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

您可以尝试使用事务显式运行此代码:

import com.test.TestObj

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

答案 2 :(得分:1)

您必须import com.test.TestObjnew com.test.TestObj()引用它。正如您所示。

请注意,'save'不是一个有效的方法,而是Grails在运行时装饰域类的动态方法。

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