grails - 在grails Controller 中关闭不接受参数

标签 grails groovy closures

我正在尝试使用实用程序闭包在 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/

相关文章:

grails - 如何让用户一次只能登录一次?

grails - Grails动态网址映射

具有客户端证书和 Grails 的 Tomcat

java - 使用 Java/Groovy 替换字符串中的反斜杠

C++ COM 对象热修补?

grails - 如何在Grails中渲染静态文件?

java - Groovy/Grails 包含小写字母

php - 关闭导致 php-5.2 中的语法错误

javascript - Javascript 闭包和 Swift 闭包是否相同

jenkins - 使用环境值执行gradle任务