私はSpring MVC 2.5を使用しており、モデル/Beanクラスには現在、サーバー側の検証を使用しています。私がやりたかった検証の 1 つは、入力の一部が数値 (0-9) でないかどうかを確認することです。ユーザーは、「1234」の代わりに「abcd」などの数字以外の文字を入力できます。
正の BigDecimal のみを受け入れる が@Pattern
あります (ドルの金額を表します)。
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 にバインドして失敗させることだと思います。
醜い解決策の 1 つは、offerSize セッター メソッドにある可能性があります。次の値を確認し、数値でない場合は何かを実行できます。しかし、私はそれが好きではありません。
このような拘束力のある問題に対処するためのより良い方法は何ですか?
参考までに: 後でクライアント側の検証 (JQuery を使用) を行うことはわかっています。ここで、ユーザーが何らかの方法でクライアント側の検証を通過すると仮定します。