2013-05-05 60 views
2

如何檢查在所有必需的參數已經提供了這種操作方法的Grails控制器動作。換句話說,我可以簡單地使用地圖或列表對象來指定我的動作所需的所有參數。Grails的動作所需的參數檢查

我可以得到PARAMS和做的每個動作中明確的檢查,但就是大量的代碼只是爲了簡單的驗證。有沒有一種簡單的方法,以便返回缺少的參數名稱的默認錯誤消息。

編輯

有兩件事情,我想我忘了提 - 1.這些控制器的動作是實現Web服務和它們未鏈接到GSP。 2.所需參數需要因採取的行動而有很大不同。記住使用命令對象似乎不正確的方法。每種方法都會有不同的必需參數,我們不能爲每個Web服務創建命令對象。

Spring有類似的東西在這裏我們可以指定每個動作,這是PARAMS以及他們是否是必需的或可選的。

+0

如果@tedias的解決方案過於冗長,沒有雙關語意,那麼您可以直接使用JAX-RS,也就是說,如果您需要極大的靈活性。你也可以試試grails-jaxrs - > https://github.com/krasserm/grails-jaxrs/wiki – rimero 2013-05-05 04:13:35

回答

2

如果您使用params中的數據填充Domain類的實例,則可以相應地設置約束條件,填充域類的實例並使用validate方法。

如果您要驗證的數據與Domain類沒有真正的關聯,您仍然可以使用大約相同的驗證機制,方法是創建一個Command Object並在控制器操作中指定它。

這是從文檔Command對象例如:

@grails.validation.Validateable 
class LoginCommand { 
    String username 
    String password 
    static constraints = { 
     username(blank: false, minSize: 6) 
     password(blank: false, minSize: 6) 
    } 
} 

然後在控制器:

class LoginController { 
    def login(LoginCommand cmd) { 
     if (cmd.hasErrors()) { 
      redirect(action: 'loginForm') 
      return 
     } 
     // work with the command object data 
    } 
} 

相關報價從the docs:控制器動作

之前執行Grails會自動創建一個命令對象c的實例 並通過綁定請求參數來填充其 屬性。如果該命令對象 類標有Validateable然後命令對象將是 驗證。

+0

謝謝Elias。請檢查問題中提供的進一步修改。 – saurabh 2013-05-05 03:33:39

+0

不客氣!我明白了,你是說爲了創建通用命令對象而需要的參數有太多不同的組合,對嗎?如果確實是這種情況,那麼嘗試滾動您自己的驗證機制可能是一個好主意。也許像'validateParams(params,[list,of,constraints])'這樣的方法 - 你必須爲約束提出一個很好的表示。 – elias 2013-05-05 05:29:51

2

Command對象在這些場景中很方便。您可以使用綁定來定義一個命令對象,並在每個/所有這些綁定上添加約束條件。您也可以使用自定義validator來驗證請求參數(params)。

例如:

//Command Object 
class LoginCommand{ 
    String userName 
    String password 

    static constraints = { 
     //Constraints and validator defined here 
    } 
} 

訪問命令對象控制器:

def myAction(LoginCommand lc){ 
    if(lc.hasErrors()){//redirect to error page or do something else} 
} 

你可以找到更多的細節here

把請求參數的驗證在命令對象具有低於優點:

  1. 控制器只是針對HTTP路由動作,而不是爲了驗證。因此,關注的分離。
  2. 由於命令對象的成員的action執行期間動態地綁定到params,它們充當業務對象/豆類在那裏可以處理域(應用業務域)有關的邏輯。

UPDATE

這裏是一個sample code如何Command對象可以在controller用於驗證所有actions

+0

我覺得我忘了提到兩件事 - 1.這些控制器行爲是爲了實現web服務,並且它們與GSP沒有關聯。 2.所需參數需要因採取的行動而有很大不同。記住使用命令對象似乎不正確的方法。每種方法都會有不同的必需參數,我們不能爲每個Web服務創建命令對象。 Spring有一些類似的地方,我們可以爲每個操作指定哪些是params,以及它們是必需的還是可選的。 – saurabh 2013-05-05 03:28:50

+0

UrlMapping.groovy還可以定義每個操作的約束。你也可以看看。如果我沒有弄錯,Command對象也應該適用於Web服務(例如:REST),因爲綁定到命令對象發生在調用操作之後。 – dmahapatro 2013-05-05 03:40:11

+0

UrlMapping不適用於後參數。 – saurabh 2013-05-05 04:06:26