0

我正在使用 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

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

一个丑陋的解决方案可能是在 offerSize setter 方法中,我可以检查即将到来的值并在它不是数字时做一些事情。但我不喜欢那个。

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

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

4

2 回答 2

2

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

因此,只需删除您的模式或创建您的字段String并自己解析它。(第二种解决方案不好)。

顺便说一句,您确定您确实需要BigDecimal用钱经营吗?你知道double有多大吗?我认为它足够容纳最近 5 千年来全世界印刷的总金额。

于 2013-06-11T19:59:03.277 回答
0

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

是的!

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

不知道你在这里的意思。有一个错误。错误被捕获。一切似乎都很好。你更喜欢什么样的行为?

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

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

于 2013-06-11T20:05:51.953 回答