我在引导 Grails 2.3.6 时加载固定装置时遇到问题。
尝试加载数据抛出空指针
这是我尝试使用的代码:
class BootStrap {
def fixtureLoader
def init = { ServletContext ctx ->
environments {
...
development {
fixtureLoader.load("developmentTinySanityCheckData")
}
}
}
...
我的项目位于~/grails-2.3.6-workspace/imca2 所以我希望上面的内容能够加载 developmentTinySanityCheckData.groovy 来自~/grails-2.3.6-workspace/imca2/fixtures
该文件确实存在并且可读:
ls -lt ~/grails-2.3.6-workspace/imca2/fixtures
-rw-r--r-- 1 nick nick 83 2014-03-16 19:32 developmentTinySanityCheckData.groovy
并包含最少的数据:
fixture {
DoctorDecisionMakerType(com.ubergen.DecisionMakerType) {
code = "Doctor"
}
}
但是加载失败,GrailsContextLoader NullPointerException: Cannot invoke load() on null object
[localhost-startStop-1] ERROR context.GrailsContextLoader - Error initializing the application: Cannot invoke method load() on null object
java.lang.NullPointerException: Cannot invoke method load() on null object
at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:77)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:45)
...
at BootStrap$_closure1_closure3_closure6.call(BootStrap.groovy)
at groovy.lang.Closure.call(Closure.java:405)
at BootStrap$_closure1_closure3_closure6.call(BootStrap.groovy)
...
无法注入(inject)FIXTURELOADER?
我假设空对象意味着 fixture 加载器没有被实例化;也许它不是由依赖注入(inject)器创建的?不知道这个说法是否正确。
我试图强制fixtureLoader存在:
class BootStrap {
def fixtureLoader
def init = { ServletContext ctx ->
fixtureLoader = ctx.getBean('fixtureLoader'); // INJECT LOADER
environments {
...
development {
fixtureLoader.load("developmentTinySanityCheckData")
}
}
}
...
但是得到 - 没有 getBean() 的签名适用于参数 [fixtureLoader]
ERROR context.GrailsContextLoader - Error initializing the application: No signature of method: org.apache.catalina.core.ApplicationContextFacade.getBean() is applicable for argument types: (java.lang.String) values: [fixtureLoader]
版本:
ubuntu 10.04
eclipse / SpringToolSuite 3.4.0
grails 2.3.6
groovy 2.1.9 (for both project and workspace)
grails plugins:
build-test-data 2.1.2
fixtures 1.2
最佳答案
我最初的问题是尝试在fixtureLoader 上调用load 时抛出了一个空指针。看来fixtureLoader 不可用,至少在开发模式下是这样。
在检查 BuildConfig.groovy 时我发现
plugins {
...
compile ":build-test-data:2.1.2"
test ":fixtures:1.2"
}
这可能意味着只有在执行模式为测试时才创建 fixture 加载器并可供使用。
我将其更正为:
plugins {
...
compile ":build-test-data:2.1.2"
compile ":fixtures:1.2"
}
并且加载程序也已创建并在开发模式下工作。
关于grails - 无法在 grails 2.3.6 中加载数据或为 FixtureLoader 1.2 创建加载程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22442551/