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?

Foi útil?

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> 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top