如何在Utils或src / groovy上使用域类方法?

时间:2016-03-21 11:32:43

标签: java grails gorm grails-2.0 grails-domain-class

我正在使用grails应用程序。我想执行类似get()save()delete()findBy()等方法并与grails应用程序域相关联的方法。当我在 Utils src / groovy 包中执行Domain.get()方法时,我会收到以下错误。

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 / groovy 类中使用域类方法?

2 个答案:

答案 0 :(得分:0)

此错误是由未与GORM正确注册的GORM实体进行交互引起的。该错误与从(src/groovygrails-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版本可能是相关的。

我希望一切都有道理。

答案 1 :(得分:-1)

您不应在(u'8', u'Event 5', 3) 内或src/groovy内使用域类。你应该为它使用服务。查看best practises for Grails architecture

  

<强>域

     
      
  • 支持将模型域特定逻辑放在自己的域中。任何适用于具有少量依赖关系的单个域的内容都应该放在其域类中。但是它仅限于该域特定的逻辑 - 处理一组域的更复杂的业务逻辑属于服务。
  •   
  • 要重用常见的部分查询或分解复杂逻辑,请使用命名查询并根据需要将它们链接在一起,就像通常链式jQuery函数调用一样。
  •   
  • 不要混合域文件夹中的任何其他常用实用程序类或值对象,而是可以进入src / groovy。如果这些类需要支持验证,可以使用@Validateable注释它们。
  •   

如果您仍想这样做,请检查this FAQ

utils