【问题标题】:How can Services be be accessed within Grails scripts?如何在 Grails 脚本中访问服务?
【发布时间】:2014-07-07 21:29:45
【问题描述】:

关于 create-script/run-script 的文档很少,所以我想知道是否可以在 grails 脚本中注入/使用域类。 在普通的 grails 类中,我可以注入如下服务:

定义我的服务

但我不确定 grails 脚本中的哪个位置

【问题讨论】:

  • 问题似乎令人困惑?我想知道是否可以在 grails 脚本中注入/使用域类。这是问题还是将服务注入到 grails 脚本中,它以它结束并且是问题的主题?

标签: grails


【解决方案1】:

在脚本中使用 domainClasses:

includeTargets << grailsScript("_GrailsBootstrap")

在顶部

然后在需要访问权限的函数内添加:

depends(bootstrap)

def myDomainClass = grailsApp.classLoader.loadClass("myapp.MyDomainClass")
def myDomainClassList = myDomainClass.list()

The Definitive Guide to Grails 2 中有很多关于这一切的信息

【讨论】:

  • 这对服务 bean 的工作方式是否相同? IE。由 Spring 初始化。
  • @Vinny 试试grailsApp.mainContext.getBean('serviceName')
  • 感谢 Sérgio Michels,这就是为我所做的。现在把它放在一个答案中:)
【解决方案2】:

使用 Grails 2.4.3 时,这是我的完整解决方案:

首先,正如 Tai 在"Error loading plugin manager: TomcatGrailsPlugin" on Grails 2.3 Database Migration 中提到的,将 buildConfig.groovy 中的 tomcat 构建类型更改为编译而不是像这样构建:

compile ':tomcat:7.0.42'

这避免了每次运行脚本时都会发生的“加载插件管理器时出错:TomcatGrailsPlugin”错误。

接下来,创建脚本/DoSomething.groovy

includeTargets << grailsScript("_GrailsInit")
includeTargets << grailsScript("_GrailsBootstrap")
includeTargets << grailsScript("_GrailsClasspath")

target(main: "An example script that calls a service") {
    depends(bootstrap)

    def someService = appCtx.getBean("someService") // look up the service
    someService.runReportOrSomething() // invoke a method on the service
}

setDefaultTarget(main)

以上代码会导致整个 Grails 堆栈初始化,因此您的所有服务、域类等都会为您设置好。

最后,要运行它,请执行以下操作:

grails prod do-something --stacktrace -echoOut

您可能很想执行“grails run-script scripts/DoSomething.groovy”,但无论出于何种原因,这似乎都行不通。

【讨论】:

  • 听起来不错。当我能找到一些时间来测试这个时,将标记为答案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多