自定义插件 - 在战争中部署时,bean不会注入控制器

时间:2014-09-15 16:52:40

标签: grails grails-plugin

我在写一个插件时遇到问题。我有一个以编程方式构建“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提供)。

2 个答案:

答案 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时,它会正确注入。