我正在使用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 类中使用域类方法?
答案 0 :(得分:0)
此错误是由未与GORM正确注册的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版本可能是相关的。
我希望一切都有道理。
答案 1 :(得分:-1)
您不应在(u'8', u'Event 5', 3)
内或src/groovy
内使用域类。你应该为它使用服务。查看best practises for Grails architecture:
<强>域强>
- 支持将模型域特定逻辑放在自己的域中。任何适用于具有少量依赖关系的单个域的内容都应该放在其域类中。但是它仅限于该域特定的逻辑 - 处理一组域的更复杂的业务逻辑属于服务。
- 要重用常见的部分查询或分解复杂逻辑,请使用命名查询并根据需要将它们链接在一起,就像通常链式jQuery函数调用一样。
- 不要混合域文件夹中的任何其他常用实用程序类或值对象,而是可以进入src / groovy。如果这些类需要支持验证,可以使用@Validateable注释它们。
如果您仍想这样做,请检查this FAQ:
utils