2011-09-15 17 views
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; 
      } 
     } 
    } 

 

intersted在grails 1.3.7兼容的解決方案。它有可能嗎?

回答

1

不,不可能做你在問什麼。 Command對象不是像Controller,Service等完整的框架構件,因此它們不會將其驗證邏輯添加到它們中,除非它們是Controller操作的參數。爲此,過濾器中的命令對象不會有.validate().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; 
} 

確保您的validateable類的補充包的名字Config.groovy中的grails.validateable.packages列表。

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 
     } 
    } 
} 
+0

另外,如果你不介意做一個插件,你可以在方法封裝這一它會自動添加到所有控制器,所以它只會是'onValid(cmd){...}',而沒有該服務。 – OverZealous

+0

另一個選項 - 而不是插件,爲您的控制器創建基類,並從中繼承。然後,你也可以使它成爲一個簡單的方法調用,就像上面一樣。 – OverZealous

相關問題