Grails não shell de ver objetos de domínio
-
19-09-2019 - |
Pergunta
Eu sou um novato grails (e um novato Groovy), e eu estou trabalhando através de alguns Grails tutoriais. Como um novo usuário, os grails Shell é uma ferramenta pouco realmente útil para mim, mas eu não consigo descobrir como fazê-lo ver minhas classes e objetos. Aqui está o que estou tentando:
% 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
Eu estava sob a impressão de que os grails desembolsar podia ver todos os controladores, serviços e objetos de domínio. O que há com isso? Preciso fazer alguma coisa aqui?
Eu tentei uma outra coisa:
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
O que estou fazendo de errado?
EDIT: Ok, eu vi as respostas sobre como usar o nome completo e também usando .save()
vez de .save
. Mas o que sobre 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
O que eu fiz de errado desta vez?
Solução
O conselho de I segundo Burt usar o console em vez do shell. Quanto à exceção:
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
Você pode tente executar explicitamente esse código com uma transação:
import com.test.TestObj
TestObj.withTransaction{ status ->
TestObj().save()
}
Outras dicas
Você precisa do pacote, já que é possível (mas não uma boa idéia) ter duas classes de domínio com o mesmo nome em diferentes pacotes.
Para a 2ª sessão deve ser foo.save (), não foo.save.
Eu prefiro o console, que é muito mais fácil trabalhar com. Run 'grails console' eo app balanço será iniciado. É um pouco diferente a partir do console regulares Groovy em que ele tem um 'ctx' implícita variável disponível, que é o contexto de aplicação da Primavera. Você pode usar isso para os serviços de acesso e outros grãos de primavera via "ctx.getBean ( 'FooService')"
você terá que import com.test.TestObj
ou referenciá-lo por new com.test.TestObj()
como você tem mostrado.
Note que 'save
' não é um propery mas um método dinâmico que Grails decora a classe de domínio com em tempo de execução.
groovy:000> foo = new com.test.TestObj();
===> com.test.TestObj : null
groovy:000> foo.save()
===> com.test.TestObj : 2
groovy:000>