如何在运行时向Grails域对象添加动态方法而不创建插件?

如何在运行时向Grails域对象添加动态方法而不创建插件?,grails,grails-plugin,Grails,Grails Plugin,在ref文档中,我只找到了如下示例 class ExamplePlugin { def doWithDynamicMethods = { applicationContext -> application.controllerClasses.each { controllerClass -> controllerClass.metaClass.myNewMethod = {-> println "hello world" }

在ref文档中,我只找到了如下示例

class ExamplePlugin {
  def doWithDynamicMethods = { applicationContext ->
        application.controllerClasses.each { controllerClass ->
             controllerClass.metaClass.myNewMethod = {-> println "hello world" }
        }
  }
}

但是我不想为这样的代码创建插件…

你不必这么做。您的示例的最里面一行是必需的。假设你有

SomeDomain
作为一个班级。你能行

SomeDomain.metaClass.newMethod  = {-> // stuff }
现在我要去核实一下……;)

编辑--我已经验证过了。只需在命令行的GroovyShell中键入以下内容

class Example {}; Example.metaClass.newMethod = {-> println 'hello'}; def e = new Example(); e.newMethod()

您可以在init闭包中的grails app/conf/BootStrap.groovy文件中添加动态方法,然后它们应该在应用程序启动时可用


请注意,以这种方式添加的动态方法在单元测试中不可用。它们将在集成测试和运行时可用。

这种方法需要做的一件事是在BootStrap.groovy中添加“def grailsApplication”作为依赖项注入,以便访问工件。然后可以调用“grailsApplication.controllerClasses.each…”