Spring MVC属性/字段绑定异常

时间:2013-06-11 19:48:48

标签: java spring spring-mvc model-binding numberformatexception

我正在使用Spring MVC 2.5和我的模型/ bean类,目前,我使用服务器端验证。我想要做的一个验证是检查某些输入是否不是数字(0-9)。用户可以输入非数字字符,例如“abcd”而不是“1234”。

我有@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 page

 <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 个答案:

答案 0 :(得分:2)

错误消息是可自我解释的。 @Pattern可用于验证String参数。数字(intdoubleBigDecimal等)会自动解析,无需特殊验证。

因此,只需移除您的模式或制作您的字段String并自行解析即可。 (第二种解决方案很糟糕)。

顺便说一下BTW你确定你确实需要BigDecimal才能用钱操作吗?你知道double有多大吗?我认为它足以容纳最近五千年来在全世界印刷的总金额。

答案 1 :(得分:0)

  
    

我认为问题出在检查模式之前,它将字符串值绑定到BigDecimal,这会使其失败。

  

是的!

  
    

处理此类绑定问题的更好方法是什么?

  

不确定你的意思。有一个错误。错误被抓住了。一切似乎都很好。你更喜欢什么行为?

  
    

仅供参考:我知道我将在后面进行客户端验证(使用JQuery)。现在,我假设用户通过某种方式传递客户端验证。

  

即使以后,最好还是验证客户端和服务器端IMO。客户端验证可以通过多种方式失败,无论是无辜的还是恶意的,即使不是这种情况,能够重用服务器端代码而不必担心所有验证都已消失是很好的因为它位于在客户端Java脚本中。