如何在Mixin中访问GrailsApplication?

如何在Mixin中访问GrailsApplication?,grails,controller,mixins,Grails,Controller,Mixins,我正在创建一个mixin来添加到我的控制器中,它具有一些基本的实用功能。我想在mixin中执行的一个函数是使用g.messagetaglib将错误解析为字符串。不幸的是,我似乎无法在静态mixin方法中访问GrailsApplication 我如何从mixin中访问Grails标记库,或者是否有更好的方法来实现我正在做的事情——在所有控制器之间共享公共代码 这是我正在运行的代码。我认为问题在于如何在静态方法中访问Grails标记库: static def prepareP

我正在创建一个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
                }

您可以使用多种技术之一从应用程序中的任何位置访问
grailsApplication
GrailsApplicationHolder
已被弃用,但Burt Beckwith有一个

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

class MyMixin {
    static myMethod() {
        def grailsApplication = new MyDomainClass().domainClass.grailsApplication
        // use it like normal here
    }
}
他有另一种方法来建立这个系统


或者,您可以使用更复杂但(我认为)更好的技术来创建用于访问应用程序的专用类。如果你打算在几个地方使用它,这是很好的。我在我的应用程序中创建了一个专用的
AppCtx
类,该类具有
grailsApplication
config
等的getter。这样编写更简洁:

def foo = AppCtx.grailsApplication...

我尝试了你的建议,grailsApplication是可以访问的,但是我开始在groovy内部的某个地方发现空指针异常。我认为这可能与在静态方法中使用g:tag,g:forEach有关。我将该方法移到了控制器本身——仍然保持它的静态——并得到了这个异常。我可以从静态方法访问g:tags吗?