我正在创建一个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
}
答案 0 :(得分:0)
您可以使用多种技术之一从应用程序的任何位置访问grailsApplication
。 GrailsApplicationHolder
已被弃用,但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
类,其中包含grailsApplication
,config
等的getter。以这种方式编写它会更清晰:
def foo = AppCtx.grailsApplication...