0

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

我将如何从我的 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
                }
4

1 回答 1

0

您可以grailsApplication使用多种技术之一从应用程序中的任何位置进行访问。已GrailsApplicationHolder弃用,但 Burt Beckwith在此博客文章中提供了一些解决方案

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

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

他有另一种方法在 BootStrap 中使用 metaClass设置变量。


或者,您可以使用这篇博文中涉及更多但(我认为)更好的技术来创建一个专用类来访问应用程序。如果您要在多个地方使用它,这很好。我在我的应用程序中创建了一个专用AppCtx类,它具有用于grailsApplication,config等的吸气剂。这样写会更简洁:

def foo = AppCtx.grailsApplication...
于 2012-04-27T20:07:53.647 回答