我正在尝试使用实用程序闭包在 Controller 中整合冗余代码,以进行通用的异常处理程序和响应生成。
例如,我要巩固这一点:
def newUser(){
def model = [:]
def errors
try{
model += [newUserObj:dao.newUser(...)]
}catch(Exception e){
errors = e.getMessage()
}
renderJson(model,error)
}
..为此:def newUser(){
def model = [:]
def errors
doRequest(model, errors){ ->
model += [newUserObj:dao.newUser(...)]
}
}
..在将样板代码移动到闭包时:def doRequest(model, errors, clsr){
try{
clsr.call()
}catch(Exception e){
errors = e.getMessage()
}
//!! model here is null !!
renderJson(model,error)
}
当调用doRequest()
时,该问题会在renderJson()
中发生。 model
为null,即使我确认已在 model += [newUserObj:dao.newUser(...)]
的闭包内正确分配了它。解决方法
我设法通过从闭包中返回
model
来解决此问题:def newUser(){
doRequest(){ ->
def model = [:]
def errors
model += [newUserObj:dao.newUser(...)]
[model:model, errors:errors]
}
}
def doRequest(clsr){
def model = [:]
def errors
try{
def r = clsr.call()
model = r['model']
errors = r['errors']
}catch(Exception e){
errors = e.getMessage()
}
renderJson(model,error)
}
..但是这似乎根本不是Groovy的,我首先创建了我想避免的样板代码。
最佳答案
这是您要找的东西吗?
import grails.converters.JSON
//Closure implementation
def doRequest(Closure clsr) {
def model = [:]
def errors = /No Error Message Yet/
try {
model = clsr(model)
} catch(Exception e) {
errors = e.getMessage()
}
renderJson(model, errors)
}
//Mimics an action method
def newUser() {
doRequest { model ->
model += [a:1] //Mimics the call to DAO in your question
//make sure to return the model after all operations completed
//model
}
}
//Mimics the render to JSON utility
private JSON renderJson(model, error) {
[model: model, errors: error] as JSON
}
//Mimics call to the action method
assert newUser().toString() ==
/{"model":{"a":1},"errors":"No Error Message Yet"}/
我本可以实现
doRequest()
,如下所示,但我没有这样做,因为在那种情况下,模型和错误将成为我们不希望的类的一部分(在您的情况下,它将是Controller的全局属性)。def doRequest(Closure clsr) {
try {
clsr.resolveStrategy = Closure.DELEGATE_FIRST
clsr.delegate = this
clsr()
} catch(Exception e) {
errors = e.getMessage()
}
renderJson(model, errors)
}
关于grails - 在grails Controller 中关闭不接受参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21504978/