6 Stimmen

Grails-Shell sieht keine Domain-Objekte

Ich bin ein Grails-Neuling (und ein Groovy-Neuling), und ich bin durch einige Grails-Tutorials arbeiten. Als neuer Benutzer, die Grails-Shell ist ein wirklich nützliches kleines Werkzeug für mich, aber ich kann nicht herausfinden, wie es meine Klassen und Objekte zu sehen. Hier ist, was ich versuche:

% 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

Ich hatte den Eindruck, dass die Grails-Shell alle Controller, Dienste und Domänenobjekte sehen kann. Was ist damit los? Muß ich hier etwas anderes tun?

Ich habe noch eine andere Sache versucht:

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

Was mache ich falsch?

EDIT: Okay, ich habe die Antworten über die Verwendung des vollen Namens und auch über die Verwendung von .save() anstelle von .save . Aber was ist mit diesem hier?

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

Was habe ich dieses Mal falsch gemacht?

2voto

Burt Beckwith Punkte 74817

Sie benötigen das Paket, da es möglich (aber keine gute Idee) ist, zwei Domänenklassen mit demselben Namen in verschiedenen Paketen zu haben.

Für die 2. Sitzung sollte es foo.save() sein, nicht foo.save.

Ich bevorzuge die Konsole, sie ist viel einfacher zu handhaben. Führen Sie 'grails console' aus und die Swing-App wird gestartet. Sie unterscheidet sich ein wenig von der normalen Groovy-Konsole, da sie eine implizite 'ctx'-Variable zur Verfügung hat, die den Spring-Anwendungskontext darstellt. Sie können damit auf Dienste und andere Spring Beans über "ctx.getBean('fooService')" zugreifen.

2voto

Dónal Punkte 180956

Ich schließe mich Burts Rat an, die Konsole statt der Shell zu verwenden. Bezüglich der Ausnahme:

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

Können Sie versuchen, diesen Code explizit mit einer Transaktion auszuführen:

import com.test.TestObj

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

1voto

Colin Harrington Punkte 4449

Müssen Sie import com.test.TestObj oder referenzieren Sie es mit new com.test.TestObj() wie Sie gezeigt haben.

Beachten Sie, dass ' save ' ist keine Eigenart, sondern eine dynamische Methode, mit der Grails die Domänenklasse zur Laufzeit dekoriert.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X