如何从过滤器访问命令对象,是否可能?

时间:2011-09-15 14:28:18

标签: grails grails-controller grails-validation

我经常写一些类似的东西:



    def myAction{ MyActionCommand cmd ->
       if( cmd.hasErrors() ){
          return render(status:HttpServletResponse.SC_BAD_REQUEST );
       }else{
          // actual action logic
       }


所以,我想将这种常见模式提取到一些可重用的位置。过滤器看起来很好,但我找不到从过滤器获取命令对象的方法。尝试这样的事情(在过滤器闭包中):



    formValidation( controller:'*', action:'*' ){
       before = { cmd ->
          if( cmd.hasErrors() ){
              response.sendError( HttpServletResponse.SC_BAD_REQUEST );
              return false;
          }else{
              return true;
          }
       }
    }


在grails 1.3.7中兼容解决方案。它有可能吗?

2 个答案:

答案 0 :(得分:1)

不,不可能按照你的要求去做。命令对象不是完整的框架工件,如Controller,Service等,因此它们不会将其验证逻辑添加到它们中,除非它们是Controller操作的参数。为此,过滤器中的命令对象不会使用.validate().hasErrors()方法进行检查。

作为另一种选择,您可以使用@Validateable注释:

http://grails.org/doc/latest/guide/7.%20Validation.html#7.5%20Validation%20Non%20Domain%20and%20Command%20Object%20Classes

将您的命令对象作为常规Groovy类移至src/groovy,并使用@Validateable对其进行注释。然后在您的过滤器中,您可以执行以下操作:

def validObj = new MyValidateable(params)
if (!validObj.validate()) {
    response.sendError( HttpServletResponse.SC_BAD_REQUEST );
    return false;
} else {
    return true;
}

确保将可验证类的包名称添加到Config.groovy中的grails.validateable.packages列表。

答案 1 :(得分:0)

如何创建这样的服务:

class AutoValidateService {
    def onValid(def cmd, Closure onValid) {
        if( cmd.hasErrors() ){
            return render(status:HttpServletResponse.SC_BAD_REQUEST );
        }else{
            onValid()
        }
    }
}

使用它如此:

class FooController {

    AutoValidateService autoValidateService

    def myAction{ MyActionCommand cmd ->
        autoValidateService.onValid(cmd) {
            // do something
        }
    }
}