我经常写一些类似的东西:
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中兼容解决方案。它有可能吗?
答案 0 :(得分:1)
不,不可能按照你的要求去做。命令对象不是完整的框架工件,如Controller,Service等,因此它们不会将其验证逻辑添加到它们中,除非它们是Controller操作的参数。为此,过滤器中的命令对象不会使用.validate()
或.hasErrors()
方法进行检查。
作为另一种选择,您可以使用@Validateable
注释:
将您的命令对象作为常规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
}
}
}