我是一个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
这次我做错了什么?
答案 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.TestObj
或new 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>