【问题标题】:How to Access GrailsApplication in a Mixin?如何在 Mixin 中访问 GrailsApplication?
【发布时间】:2012-04-27 18:45:30
【问题描述】:

我正在创建一个 mixin 以添加到具有一些基本实用功能的控制器中。我想在 mixin 中执行的功能之一是使用 g.message taglib 将错误解析为它们的字符串。不幸的是,我似乎无法在我的静态 mixin 方法中访问 GrailsApplication

如何从我的 mixin 访问 Grails 标签库,或者有更好的方法来实现我正在做的事情——在所有控制器之间共享公共代码?

这是我正在运行的代码。我认为问题是如何在静态方法中访问 Grails 标签库:

            static def preparePostResponse(domainInstance) {

                    def grailsApplication = new User().domainClass.grailsApplication


                    def postResponse = new AjaxPostResponse(domainObject: domainInstance)

                    if (domainInstance.hasErrors()) {
                        g.eachError(bean: domainInstance) {
                            postResponse.errors."${it.field}" = g.message(error: it)
                        }
                        postResponse.success = false
                        postResponse.message = "There was an error"
                    }
                    else {
                        postResponse.success = true
                        postResponse.message = "Success"
                    }
                    return postResponse
                }

【问题讨论】:

    标签: grails controller mixins


    【解决方案1】:

    您可以使用多种技术之一从应用程序中的任何位置访问grailsApplicationGrailsApplicationHolder 已被弃用,但 Burt Beckwith 有一个 couple of solutions in this blog posting

    可能最简单的方法是将其从现有域中拉出,如下所示:

    class MyMixin {
        static myMethod() {
            def grailsApplication = new MyDomainClass().domainClass.grailsApplication
            // use it like normal here
        }
    }
    

    他有另一种方法设置variables in BootStrap using metaClass here


    或者,您可以使用this blog post 中涉及更多但(我认为)更好的技术来创建一个专用类来访问应用程序。如果您要在多个地方使用它,这很好。我在我的应用程序中创建了一个专用的AppCtx 类,其中包含grailsApplicationconfig 等的getter。这样写会更简洁:

    def foo = AppCtx.grailsApplication...
    

    【讨论】:

    • 我尝试了您的建议,并且 grailsApplication 可以访问,但我开始在 groovy 内部的某个地方收到空指针异常。我认为这可能与在静态方法中使用 g: 标记 g:forEach 有关。我将方法移动到控制器本身——仍然保持静态——并得到了这个异常。`在静态范围内发现了明显的变量'g',但不引用局部变量`。我可以从静态方法访问 g: 标签吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 2012-08-13
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多