我在写一个插件时遇到问题。我有一个以编程方式构建“bean引用”的类,以便注入Spring。正在注入bean,但是当部署在WAR中时它们在控制器/服务中不可用(似乎使用run-app工作正常),除非我执行grailsApplication.mainContext.getBean('beanName')。
我的GrailsPlugin文件的片段如下所示(我在这里稍微修改了一下,所以任何语法错误都是红鲱鱼):
def loadAfter = ['controllers', 'domains', 'services']
def doWithSpring = {
beanDefinitionBuilder(BeanDefinitionBuilder, ref('classLoader'), application)
}
def doWithApplicationContext = { ctx ->
BeanDefinitionBuilder builder = ctx.beanDefinitionBuilder
def beans = beans {
for (String myBean : builder.getBeanNames()) {
"${myBean}"(builder:"getService") { bean ->
bean.autowire = 'byName'
}
}
}
beans.registerBeans(ctx)
}
有谁知道为什么这适用于run-app但不适用于战争或者我正在做的事情是完全错误的,我应采取什么方法。我最初在'doWithSpring'块中有完整的代码,但我需要加载资源,所以我需要ResourceLoader(通过实现ResourceLoaderAware提供)。
答案 0 :(得分:0)
我们遇到一些问题,即应用程序的行为方式与已部署的war文件相比,通过run-app。罪魁祸首是分叉编译,我们通过编辑BuildConfig.groovy
关闭了编码:
grails.project.fork = [
test: false,
run: false,
war: false,
console: false
]
我不确定这样做的后果(对Grails应用程序的其余部分),因为我不对更改负责,所以YMMV。
答案 1 :(得分:0)
我设法解决了我的问题。我确实尝试过上面提到的昵称,但这不起作用。相反,我设法在战争中解决了我的资源加载问题,并将弹簧注入代码移动到'doWithSpring'闭包中。现在,在测试环境和战争中使用run-app时,它会正确注入。