向 Grails 中的对象添加方法并使其全局可用

Posted

技术标签:

【中文标题】向 Grails 中的对象添加方法并使其全局可用【英文标题】:Add a method to an object in Grails and have it usable globally 【发布时间】:2012-02-29 07:10:01 【问题描述】:

我正在尝试通过利用 Groovy 的 metaclass 功能向 String 类添加一些字符串实用方法。现在我的 BootStrap.groovy 脚本的 init 闭包中有类似的东西:

String.metaClass.upper = 
   delegate.toUpperCase()

问题是这个 upper 方法只在 BootStrap 的范围内可用...试图在 Grails 应用程序的其他任何地方使用它都不起作用,并且我得到方法丢失错误。

有没有办法让这些方法随处可用?

【问题讨论】:

【参考方案1】:

在测试和运行环境中都会发生这种情况吗?存在一个错误,即所有 metaClass 更改在每次单元测试后都会回滚:http://jira.grails.org/browse/GRAILS-8596

【讨论】:

我没有尝试在测试中使用这些方法。当我尝试加载使用我添加的方法之一的视图时,我可以看到它们不存在。但是,如果我在 BootStrap 中的定义之后放置一个断点,我可以添加使用我正确添加的方法的手表,但是一旦它们超出范围,我就会得到方法缺失错误。 我用一个新的 grails 2.0 项目尝试了你的 String.upper() 示例,它在控制器和视图中都适用于我。你能发布整个BootStrap.groovy 和你用来调用它的代码吗?

以上是关于向 Grails 中的对象添加方法并使其全局可用的主要内容,如果未能解决你的问题,请参考以下文章

Grails - 使方法全局可用和元类编程

Grails - 向 params 映射添加参数

Grails - 向所有域对象添加 where 子句

将对象推入数组并使其不可变

我可以在 Visual Studio 2003 中添加文件并使其指向另一个项目中的现有文件吗?

Grails:在测试中可用的运行时添加方法?