2016-03-21 3 views
0

Я работаю с применением гранул. Я хочу выполнить такие методы, как get(), save(), delete(), findBy() и т. Д. И связанные с областями применения грабли. Когда я выполняю Domain.get() метод внутри Utils или src/groovy package Я получаю следующую ошибку.Как использовать методы класса домена в Utils или 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. 

Любой один помочь мне, как я могу использовать метод класса внутри домена Utils или SRC/заводной классов?

+0

Вам нужно предоставить больше контекста для вашего вопроса. Где вы используете свои классы в 'src/groovy'? Что называется, и, в свою очередь, называет ваши классы домена? Постарайтесь предоставить более подробные сведения о своем вопросе, с фактическими примерами того, что вы делаете, и получите более качественные ответы. –

+0

импорта com.chatportal.ShiroUser класс ChatUtility { \t статические основные (арг) { \t \t Защиту chatUtility = новый ChatUtility() \t \t chatUtility? .display (1) \t} \t \t четкости дисплей (Защита идентификатор) { \t \t Println "ChatUtility Чат Пользователь:" + ShiroUser.get (идентификатор) \t} } –

+0

ли ошибка происходит в тесте или в т он работает приложение? –

ответ

-1

Вы не должны использовать классы домена внутри src/groovy или внутри utils. Вы должны использовать для этого службы. Проверьте best practises for Grails architecture:

домена

  • благосклонности размещение модель домена специфическую логику в своем собственном домене. Все, что относится к одному домену с небольшими зависимостями, должно идти в его классе домена. Но ограничьте его только логикой, характерной только для этого домена. Более сложная бизнес-логика, которая имеет дело с группой доменов, принадлежит службе.
  • Чтобы повторно использовать общие частичные запросы или разложить сложную логику, используйте именованные запросы и соедините их вместе, как требуется, так же, как обычно вызывает вызовы функции jQuery.
  • Не смешивайте какие-либо другие общие классы полезности или объекты значения в папке домена, скорее они могут идти в src/groovy. Если эти классы должны поддерживать валидацию, их можно аннотировать с помощью @Validateable.

Если вы все еще хотите сделать это, проверьте this FAQ:

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

Я уже создал класс домена внутри PROJECT/grails-app/domain/ –

+2

@Michal_Szulc «Вы не должны использовать классы домена внутри src/groovy или внутри utils». - Ссылка на классы домена из кода, который определен в 'src/groovy', является вполне разумной вещью. –

+0

IMHO это чище, чтобы вся логика, управляемая доменом, в «домен» и использовала методы 'services' в качестве клея между различными методами' domain' и 'src/groovy' helpers. «контроллеры» будут обработчиками потоков, и, конечно, дополнительные классы справки уходят в 'src/groovy'. Почему вы хотите его смешивать? –

0

Эта ошибка вызвана при взаимодействии с Горм лицами, которые не были должным образом зарегистрированы в GORM. Ошибка не имеет никакого отношения к тому, где инициируется взаимодействие с (src/groovy, grails-app/services/ и т. Д.).

Не всегда, но чаще всего эта ошибка возникает в среде тестирования, где тип объекта не был зарегистрирован в GORM.

Просмотреть проект в https://github.com/jeffbrown/illegalaccessgorm. Этот проект содержит следующее.

Класс домена:

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

class Person { 
    String name 
} 

Служба:

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

class HelperService { 

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

Класс утилиты:

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

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

Тест модуль для службы:

// 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 
    } 
} 

модульный тест для класса утилиты:

// 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 
    } 
} 

Оба эти тесты проходят. Если удалить @Mock(Person) из любого из них, тест потерпит неудачу со следующим:

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. 

Если проблема возникает в том или ином контексте, кроме теста, узнать больше о контексте было бы полезно. Другими вероятными подозреваемыми являются Java-объекты, которые по какой-то причине не инициализируются должным образом, а в некоторых случаях классы домена, вносимые из плагинов, могут быть проблематичными.

Кроме того, важно знать, какая версия Grails вы используете.

Я надеюсь, что все имеет смысл.