java - Spring MVC 属性/字段绑定(bind)异常

标签 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页面

 <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

我认为问题是在检查模式之前,它将字符串值绑定(bind)到 BigDecimal,这导致它失败。

一个丑陋的解决方案可能是在 OfferSize setter 方法中,我可以检查即将到来的值并在它不是数字时执行某些操作。但我不喜欢那个。

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

仅供引用:我知道稍后我将进行客户端验证(使用 JQuery)。现在,我假设用户以某种方式通过了客户端验证。

最佳答案

该错误消息是不言自明的。 @Pattern 可用于验证String 参数。数字(intdoubleBigDecimal 等)会自动解析,不需要特殊验证。

因此,只需删除您的模式或将您的字段设为String并自行解析即可。 (第二个解决方案很糟糕)。

顺便说一句,您确定确实需要 BigDecimal 来操作金钱吗?你知道double有多大吗?我认为它足够大,足以容纳近五千年来全世界印制的货币总量。

关于java - Spring MVC 属性/字段绑定(bind)异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17052484/

相关文章:

java - Infinispan 警告 : org. jgroups.conf.XmlConfigurator:配置文件中缺少版本

Java语法 <?> 解释

spring - 无法解决 Spring 安全性

java - Spring 应用程序未在 Debug模式下部署

java - 在 Spring Boot 中处理重定向的正确方法是什么?

java - 从 String 转换为 HashMap 的最佳方法是什么?

java - Android如何检测网络类型改变事件?

java - 如何修复 java.security.InvalidAlgorithmParameterException : the trustAnchors parameter must be non-empty when connecting to elasticsearch

java - 找不到springframework的标签库描述符

mysql - Spring MVC、Hibernate、MySQL(数据库关系)