2013-03-11 61 views
4

Grails在數據綁定方面存在一個錯誤,它在處理錯誤的數字輸入時會拋出一個轉換異常。 JIRA:http://jira.grails.org/browse/GRAILS-6766Grail的錯誤屬性來自哪裏?

爲了解決這個問題,我寫了下面的代碼來手動處理在位於src/groovy

void setPrice(String priceStr) 
{ 
    this.priceString = priceStr 

    // Remove $ and , 
    priceStr = priceStr.trim().replaceAll(java.util.regex.Matcher.quoteReplacement('$'),'').replaceAll(',','') 

    if (!priceStr.isDouble()) { 
     errors.reject(
      'trade.price.invalidformat', 
      [priceString] as Object[], 
      'Price:[{0}] is an invalid price.') 

     errors.rejectValue(
      'price', 
      'trade.price.invalidformat') 
    } else { 
     this.price = priceStr.toDouble(); 
    } 
} 

下拋出的errors.reject()線空引用異常的POGO類Foo的數字輸入。

foo.price = "asdf" // throws null reference on errors.reject() 
foo.validate() 

不過,我可以說:

foo.validate() 
foo.price = "asdf" // no Null exception 
foo.hasErrors() // false 
foo.validate() 
foo.hasErrors() // true 

哪裏出錯來的時候validate()叫? 有沒有辦法添加errors屬性,而不是先撥打validate()

回答

6

我不能完全告訴你爲什麼,但你需要明確地調用getErrors()而不是像屬性一樣訪問它作爲errors。出於某種原因,Groovy沒有爲它調用方法。因此,改變setPrice()reject

getErrors().reject(
     'trade.price.invalidformat', 
     [priceString] as Object[], 
     'Price:[{0}] is an invalid price.') 

getErrors().rejectValue(
     'price', 
     'trade.price.invalidformat') 

這是爲了確保在你的方法存在Errors對象的最簡單方法。您可以將check out the code添加到您的域類的驗證相關方法。

2

錯誤將添加到您的驗證類(具有註釋@Validateable的域類和類)。

允許開發人員設置字符串而不是數字似乎不是一個好方法。此外,您的驗證將僅適用於該特定類別。

我認爲更好的方法是爲數字註冊自定義屬性編輯器。這裏的日期是a example,可以使用像dd/MM/yyyy這樣的格式對String(從表單中提交)到Date進行轉換。這個想法是一樣的,因爲你會強制你的號碼是可解析的(例如,Integer.parseInt()會拋出異常)。

在你的領域類中,使用數字類型而不是字符串,所以通過代碼開發者將不被允許存儲數字值。

5

的AST轉換處理@Validateableaugments the class with, among other things

  • 了一場名爲errors
  • 公共方法getErrorssetErrorsclearErrorshasErrors

getErrors方法懶洋洋地設置errors場,如果它不是招」尚未設置。所以看起來好像是在同一個類中對errors的訪問被視爲字段訪問而不是Java Bean屬性訪問,並繞過了惰性初始化。

因此,修復似乎是使用getErrors()而不是僅僅使用errors

+0

Hrm,我必須掩蓋POGO位,並假設它是一個域類 – doelleri 2013-03-11 22:53:00

+0

@doelleri我認爲同樣的轉換也適用於域類,您鏈接的代碼只會觸發那些未被增強的域類在編譯時(這可能發生在開發模式自動重新編譯)。你值得接受,我只是在處理你的「我不能完全告訴你爲什麼」:-) – 2013-03-11 23:02:15