Domanda

Sono un principiante graal (e un novizio Groovy), e sto lavorando attraverso alcuni tutorial Grails. Come nuovo utente, il guscio graal è un piccolo strumento davvero utile per me, ma io non riesco a capire come farlo vedere le mie classi e oggetti. Ecco quello che sto cercando:

% 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

Ho avuto l'impressione che il guscio graal poteva vedere tutti i controller, servizi e oggetti di dominio. Che succede con questo? Ho bisogno di fare qualcosa di diverso qui?

ho provato un'altra 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

Che cosa sto facendo di sbagliato?

EDIT: Okay, ho visto le risposte su come usare la denominazione completa e anche utilizzando .save() invece di .save. Ma che dire di questo?

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

Cosa ho fatto di sbagliato questa volta?

È stato utile?

Soluzione

I secondo consiglio di Burt per utilizzare la console al posto del guscio. Per quanto riguarda l'eccezione:

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

Potete provare esplicitamente l'esecuzione di questo codice con una transazione:

import com.test.TestObj

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

Altri suggerimenti

È necessario il pacchetto dal momento che è possibile (ma non una buona idea) per avere due classi di dominio con lo stesso nome in diversi pacchetti.

Per la 2a sessione dovrebbe essere foo.save (), non foo.save.

Io preferisco la console, è molto più facile lavorare con. Run 'graal console' e l'applicazione swing avrà inizio. E 'un po' diverso dalla console Groovy normale in quanto è ottenuto variabile disponibile un implicito 'CTX', che è il contesto di applicazione di primavera. È possibile utilizzare che per accedere ai servizi e altri bean Spring tramite "ctx.getBean ( 'fooService')"

si dovrà import com.test.TestObj o farvi riferimento da new com.test.TestObj() come avete dimostrato.

Si noti che 'save' non è un propery ma un metodo dinamico che Grails decora la classe di dominio con in fase di esecuzione.

groovy:000> foo = new com.test.TestObj();
===> com.test.TestObj : null
groovy:000> foo.save()
===> com.test.TestObj : 2
groovy:000> 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top