重构Grails命令验证

在我的应用程序中,我有很多代码如下:

def add(CreatePersonCommand command) {
    if(command.hasErrors()) {
        redirect(action: 'add')
        return
    }
}

我不喜欢这种重复,所以我想重构它.我希望Grails会有如下内容

@Validate(action:'someAction')
def add(CreatePersonCommand command) {

}

要么

def add(@Valid CreatePersonCommand command) {
}

哪个会自动验证命令,并在出现错误重定向到GSP.我尝试用拦截器和过滤器创建这样的东西,但我失败了,因为我无法访问过滤器中的操作和命令.

也许我错过了一些东西,但有没有更好的方法来处理这个问题,或者实现类似上面的东西?

解决方法

考虑到问题中的评论,我提出了一个时间性的解决方法.

一个像这样的命令:

@grails.validation.Validateable
class FooCommand implements Serializable {
    String username
    String email
    static constraints = {
        username nullable: false,blank: false,minSize: 6
        email email: true,nullable: false,blank: false
    }
}

并且具有动作索引的Controller仅在params验证命令对象时执行,并且在验证错误的情况下重定向到动作错误

class FooController {
    def index() {
        render 'ok!'
    }
    def error() {
        render 'errors = ' + params.errors
    }
}

然后,您可以为所有请求(或您想要的请求)定义过滤器,并根据请求尝试的控制器和操作,您可以使用所需的参数验证命令对象,如下所示:

class FooFilters {
    def filters = {
        all(controller:'*',action:'*') {
            before = {
                if (params.controller == 'foo' && (!params.action || params.action == 'index')) {
                    FooCommand cmd = new FooCommand(params.subMap(['username','email']))
                    if (!cmd.validate()) {
                        redirect controller: 'foo',action: 'error',params: [errors:cmd.errors]
                        return false
                    }
                }
                return true
            }
        }
    }
}

可以通过多种方式改进此代码.但我认为这足以作为一个示例解决方案.

相关文章

背景:    8月29日,凌晨4点左右,某服务告警,其中一个...
https://support.smartbear.comeadyapi/docs/soapui/steps/g...
有几个选项可用于执行自定义JMeter脚本并扩展基线JMeter功能...
Scala和Java为静态语言,Groovy为动态语言Scala:函数式编程,...
出处:https://www.jianshu.com/p/ce6f8a1f66f4一、一些内部...
在运行groovy的junit方法时,报了这个错误:java.lang.Excep...