【问题标题】:Use grails plugin datasource使用 grails 插件数据源
【发布时间】:2013-12-28 09:52:07
【问题描述】:

我正在使用 Grails 2.2.4 构建插件。该插件是一个访问管理器,需要访问一些数据源(多个)。正如 Grails 手册在 Providing Basic Artefacts 中指定的那样,DataSource.groovy 没有与插件捆绑在一起。

有没有办法将插件 DataSource.groovy 文件中定义的数据源“复制”到使用该插件的应用程序的 DataSource.groovy 文件中?

我真的不想在每个使用插件的应用程序上手动定义插件数据源。

============

完整的堆栈跟踪(在 cmets 中请求)

2013-12-11 11:39:33,055 ERROR org.codehaus.groovy.grails.web.context.GrailsConte
xtLoader - Error initializing the application: groovy.lang.MissingMethodExceptio
n: No signature of method: portal.Aplicacao.methodMissing() is applicable for ar
gument types: () values: []
org.codehaus.groovy.runtime.InvokerInvocationException: groovy.lang.MissingMetho
dException: No signature of method: portal.Aplicacao.methodMissing() is applicab
le for argument types: () values: []
        at grails.util.Environment.evaluateEnvironmentSpecificBlock(Environment.
java:308)
        at grails.util.Environment.executeForEnvironment(Environment.java:301)
        at grails.util.Environment.executeForCurrentEnvironment(Environment.java
:277)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExec
utor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor     .java:908)
        at java.lang.Thread.run(Thread.java:662)
Caused by: groovy.lang.MissingMethodException: No signature of method: portal.Ap
licacao.methodMissing() is applicable for argument types: () values: []
        at portal.PortalService.criaAplicacaoNoPortal(PortalService.groovy:233)
        at BootStrap$_closure1.doCall(BootStrap.groovy:16)
        ... 8 more

【问题讨论】:

  • 嗯...你是如何运行这段代码的?您是在运行插件还是将其包含在应用程序中?
  • 在应用程序中包含插件。当应用程序运行 BootStrap 时异常跳出,所以我认为平台核心插件还没有调用我的插件,对吗?
  • 嗯,我不这么认为,几周前我做了同样的事情,在应用程序 BootStrap 中使用插件实体,它工作正常。我不记得有这个确切的问题,但我记得必须用 PluginEntity.withTransaction { /* code using plugin entities here */ } 包围代码。
  • 我的 BootStrap 调用插件中定义的服务,该服务是使用实体的服务。所以没有办法调用 withTransaction 其他实体员工也没有办法做到这一点
  • 使用 grails 控制台配置可以工作,但是使用 run-app 配置没有加载(我使用了很多 printlns 来发现这一点)。好吧,最后,我发现其他插件搞砸了应用程序的启动。现在应用程序正在运行。感谢您的支持。

标签: grails grails-plugin


【解决方案1】:

您可以使用platform-core plugin,然后在插件的doWithConfig 部分中将数据源定义为应用程序配置,如下所示:

def doWithConfig = { config ->

    // ...

    application {
        Environment.executeForCurrentEnvironment {
            development {
                    dataSource_myDatasource {
                        dbCreate = "create-drop"
                        url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
                        // other datasource configuration here...
                    }
                }
            }
            test {
                    dataSource_myDatasource {
                        // test datasource
                        dbCreate = "create-drop"
                        url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
                        // ...
                    }
                }
            }
        }
    }
}

【讨论】:

  • 请注意,这不是 Grails 本身的一部分,而是 platform-config 插件的一个特性
  • @BurtBeckwith 谢谢,我忘记了!我现在正在修复答案。
  • 我使用了建议的策略,但是插件实体上出现了 MissingMethodException。你知道为什么 GORM 不起作用吗?
  • 嗯,你能发布堆栈跟踪吗?您是否安装了平台核心插件?另外,请确保在插件配置中使用loadBefore = ['dataSource']
  • 问题结束时的完整堆栈跟踪
猜你喜欢
  • 2015-03-30
  • 2011-09-09
  • 2015-07-18
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 2018-04-10
  • 2013-01-02
  • 2014-03-17
相关资源
最近更新 更多