2013-06-11 91 views
0

我正在使用Spring MVC 2.5和我的模型/ bean類,此刻,我使用服務器端驗證。我想要做的驗證之一是檢查一些輸入是否不是數字(0-9)。用戶可以輸入非數字字符,如「abcd」而不是「1234」。Spring MVC屬性/字段綁定異常

我有一個@Pattern它只接受積極BigDecimal(它代表美元金額)。

public class OfferSettingBean implements Serializable { 


private static final String NUMBER_WITH_DECIMAL_PLACES_ONLY="^\\d+([.]\\d+)?$"; 

//org.hibernate.validator.pattern 
@Pattern(regex = NUMBER_WITH_DECIMAL_PLACES_ONLY, message = "invalid.amount") 
    private BigDecimal offerSize; 
//the rest of the code goes here including setter and getter methods 
} 

jsp頁面

<input type="text" name="offerSize" id="offerSize" value="${offerSetting.offerSize}" placeholder="$" /> 

我的代碼的問題是,如果用戶輸入類似「asdfsd」它並不甚至達到它應該檢查花樣點非數字字符。

Failed to convert property value of type [java.lang.String] to required type [java.math.BigDecimal] for property offerSize; nested exception is java.lang.NumberFormatException 

我認爲問題是在檢查模式之前,它將字符串值綁定到BigDecimal,從而導致它失敗。

一個不好的解決方案可能是在offerSize setter方法中,我可以檢查即將到來的值,如果它不是數字,可以執行一些操作。但我不喜歡那個。

什麼是處理這種綁定問題的更好方法?

僅供參考:我知道我將在後面進行客戶端驗證(使用JQuery)。現在,我假設用戶通過某種方式傳遞客戶端驗證。

回答

2

錯誤消息是自解釋的。 @Pattern可用於驗證String參數。數字(int,double,BigDecimal等)被自動解析並且不需要特殊驗證。

所以,只要刪除你的模式或使你的領域String和解析它自己。 (第二種解決方案很糟糕)。

順便說一句你確定你確實需要BigDecimal來操作錢嗎?你知道double大嗎?我認爲它足以容納最近5千年以來在全世界印刷的全部金額。

+0

我希望擁有該模式的原因是在所有輸入字符都經過驗證的中心位置。所以我不必檢查它是否是否定的,無論是否包含數字或不包含數字。第二個是可能的,但正如你所說,它可能是壞的。對於後面的問題,系統已經在10年前設計好了,所以我們只需要使用BigDecimal – WowBow

0

我認爲這個問題是檢查其綁定的字符串值,以BigDecimal,它使得它失敗的模式之前。

沒錯!

什麼是更好的方式來處理這樣那樣的問題,結合?

不知道你的意思在這裏。有一個錯誤。錯誤被捕獲。一切似乎都很好。你會喜歡什麼樣的行爲?

僅供參考:我知道我將在客戶端進行驗證(使用JQuery)後者。現在,我假設用戶通過某種方式傳遞客戶端驗證。

甚至更​​晚的時候,最好驗證客戶端和服務器端IMO。客戶端驗證可能有很多種方式,無論是無辜的還是惡意的,即使情況並非如此,能夠重用服務器端代碼而不必擔心所有驗證因爲位於其中而不必擔心在客戶端Java腳本中。

+0

我需要的是顯示模式參數的消息。不是異常消息 – WowBow