2

我经常写这样的东西:



    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 兼容的解决方案感兴趣。有可能吗?

4

2 回答 2

1

不,不可能按照您的要求进行操作。命令对象不是完整的框架工件,如控制器、服务等,因此它们不会将其验证逻辑添加到其中,除非它们是控制器操作的参数。为此,过滤器中的命令对象将没有.validate()or.hasErrors()方法来检查。

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

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

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

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

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

于 2011-09-15T15:03:56.127 回答
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
        }
    }
}
于 2011-09-15T19:44:22.443 回答