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

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

String.metaClass.upper = {
   delegate.toUpperCase()
}

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

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

【问题讨论】:

    标签: grails groovy metaprogramming metaclass


    【解决方案1】:

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

    【讨论】:

    • 我没有尝试在测试中使用这些方法。当我尝试加载使用我添加的方法之一的视图时,我可以看到它们不存在。但是,如果我在 BootStrap 中的定义之后放置一个断点,我可以添加使用我正确添加的方法的手表,但是一旦它们超出范围,我就会得到方法缺失错误。
    • 我用一个新的 grails 2.0 项目尝试了你的 String.upper() 示例,它在控制器和视图中都适用于我。你能发布整个BootStrap.groovy 和你用来调用它的代码吗?
    猜你喜欢
    • 2013-03-13
    • 2013-02-17
    • 1970-01-01
    • 2013-01-18
    • 2011-09-21
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多