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