2016-03-21 11 views
0

Ich arbeite mit Grails-Anwendung. Ich möchte Methoden wie get(), save(), delete(), findBy() etc durchführen und mit Domänen der Anwendung von Grails verbunden. Wenn ich Methode innerhalb Utils oder src/groovy Paket ich bekomme folgenden Fehler ausführen.Wie Domain Klassenmethoden auf Utils oder src/groovy?

Caught: java.lang.IllegalStateException: Method on class [Domain Class] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly. 

java.lang.IllegalStateException: Method on class [Domain Class] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly. 

einer mir helfen, wie kann ich Domain-Klassenmethode innerhalb Utils verwenden oder src/groovy Klassen?

+0

Sie müssen mehr Kontext zu Ihrer Frage bereitstellen. Wo benutzt du deine Klassen innerhalb von 'src/groovy'? Was ruft sie an, und im Gegenzug rufen Sie Ihre Domain-Klassen auf? Versuchen Sie, mehr Details zu Ihrer Frage zu liefern, mit konkreten Beispielen, was Sie tun, und Sie erhalten bessere Antworten. –

+0

import com.chatportal.ShiroUser Klasse ChatUtility { \t static main (args) { \t \t def chatUtility = new ChatUtility() \t \t chatUtility? .Anzeige (1) } \t \t \t def Display (def id) { \t \t println "ChatUtility Chat Benutzer:" + ShiroUser.get (id) \t} } –

+0

Ist der Fehler in einem Test passiert oder in t er läuft app? –

Antwort

-1

Innerhalb von src/groovy oder in utils sollten Sie keine Domänenklassen verwenden. Sie sollten Dienste dafür verwenden. Check out best practises for Grails architecture:

Domain

  • Favor Platzierung Modell domänenspezifische Logik in der eigenen Domäne. Alles, was für eine einzelne Domäne mit wenigen Abhängigkeiten gilt, sollte in seiner Domänenklasse enthalten sein. Behalten Sie sie jedoch nur auf die für diese Domäne spezifische Logik - komplexere Geschäftslogik, die sich mit einer Gruppe von Domänen befasst, gehört zu einem Dienst.
  • Um häufige Teilabfragen wiederzuverwenden oder die komplexe Logik zu zerlegen, verwenden Sie benannte Abfragen und verketten sie nach Bedarf, genau wie man üblicherweise jQuery-Funktionsaufrufe kettet.
  • Mischen Sie keine anderen gebräuchlichen Hilfsklassen oder Wertobjekte im Domänenordner, sie können stattdessen in src/groovy verwendet werden. Wenn diese Klassen die Validierung unterstützen müssen, können Sie sie mit @Validateable annotieren.

Wenn Sie es noch tun wollen, überprüfen this FAQ:

import org.codehaus.groovy.grails.commons.ApplicationHolder 
//… 
def book = ApplicationHolder.application.getClassForName("library.Book").findByTitle("Groovy in Action") 
+0

Ich habe bereits eine Domain-Klasse in PROJECT/grails-app/domain/ –

+2

@Michal_Szulc erstellt. "Sie sollten keine Domain-Klassen innerhalb von src/groovy oder innerhalb von utils verwenden." - Domain-Klassen aus Code, der unter "src/groovy" definiert ist, zu referenzieren, ist durchaus sinnvoll. –

+0

IMHO ist es sauberer, alle domänengetriebene Logik in 'domain' zu setzen und' services' Methoden als Bindeglied zwischen verschiedenen 'domain' Methoden und' src/groovy' HelferInnen Methoden zu verwenden. 'Controller' würden ein Flow-Handler sein und natürlich zusätzliche Hilfsklassen in' src/groovy'. Warum willst du es mischen? –

0

Dieser Fehler wird verursacht durch mit GORM Einheiten interagieren, die mit GORM nicht ordnungsgemäß registriert. Der Fehler hat nichts damit zu tun, wo die Interaktion ausgelöst wird (src/groovy, grails-app/services/, etc ...).

Nicht immer, aber am häufigsten tritt dieser Fehler in einer Testumgebung auf, in der der Entitätstyp nicht bei GORM registriert wurde.

Siehe das Projekt unter https://github.com/jeffbrown/illegalaccessgorm. Dieses Projekt enthält Folgendes.

A domain Klasse:

// grails-app/domain/demo/Person.groovy 
package demo 

class Person { 
    String name 
} 

A Service:

// grails-app/services/demo/HelperService.groovy 
package demo 

class HelperService { 

    int getNumberOfPeople() { 
     Person.count() 
    } 
} 

eine Dienstprogrammklasse:

// src/groovy/demo/SomeHelper.groovy 
package demo 

class SomeHelper { 
    int getNumberOfPeople() { 
     Person.count() 
    } 
} 

einen Komponententest für den Service:

// test/unit/demo/HelperServiceSpec.grovy 
package demo 

import grails.test.mixin.TestFor 
import spock.lang.Specification 

@TestFor(HelperService) 
@Mock(Person) 
class HelperServiceSpec extends Specification { 


    void "test gorm method"() { 
     expect: 
     service.numberOfPeople == 0 
    } 
} 

Ein Unit-Test für die Utility-Klasse:

// test/unit/demo/SomeHelperSpec.groovy 
package demo 

import spock.lang.Specification 

@Mock(Person) 
class SomeHelperSpec extends Specification { 

    void "test gorm method"() { 
     given: 
     def helper = new SomeHelper() 

     expect: 
     helper.numberOfPeople == 0 
    } 
} 

Diese beiden Tests bestehen. Wenn Sie die @Mock(Person) von einer von ihnen entfernen, wird fehlschlagen Sie den Test mit den folgenden:

java.lang.IllegalStateException: Method on class [demo.Person] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly. 

Wenn das Problem in einem gewissen Kontext geschieht anders als ein Test, mehr über den Kontext zu wissen, wäre hilfreich. Andere wahrscheinliche Verdächtige sind Java-Entitäten, die aus irgendeinem Grund nicht richtig initialisiert werden, und in einigen Fällen können Domänenklassen, die von Plugins importiert werden, problematisch sein.

Auch zu wissen, welche Version von Grails Sie verwenden, kann relevant sein.

Ich hoffe, dass alles einen Sinn ergibt.