【发布时间】:2014-02-01 23:21:17
【问题描述】:
我正在尝试使用实用程序闭包来整合控制器中的冗余代码,以进行通用异常处理程序和响应生成。
例如,我想巩固一下:
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)
}
当调用renderJson() 时,问题发生在doRequest(); model 为空,尽管我确认它在 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,我正在创建我一开始就试图避免的样板代码。
【问题讨论】: