0

私は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 を使用) を行うことはわかっています。ここで、ユーザーが何らかの方法でクライアント側の検証を通過すると仮定します。

4

2 に答える 2

2

エラーメッセージは自明です。 引数@Patternの検証に使用できます。String数値 ( int、など) は自動的に解析されdoubleBigDecimal特別な検証は必要ありません。

したがって、パターンを削除するか、フィールドStringを作成して自分で解析してください。(2番目の解決策は悪いです)。

ところで、あなたは本当にBigDecimalお金で運営する必要があると確信していますか? doubleどれくらい大きいか知っていますか?過去5000年間に全世界で印刷された紙幣の総量を収めるのに十分な大きさだと思います。

于 2013-06-11T19:59:03.277 に答える
0

問題は、パターンをチェックする前に、文字列値を BigDecimal にバインドして失敗させることだと思います。

うん!

このような拘束力のある問題に対処するためのより良い方法は何ですか?

ここで何を意味するのかわかりません。エラーが発生しました。エラーがキャッチされました。すべてが順調に見えます。どのような動作を希望しますか?

参考までに: 後でクライアント側の検証 (JQuery を使用) を行うことはわかっています。ここで、ユーザーが何らかの方法でクライアント側の検証を通過すると仮定します。

後で、クライアント側とサーバー側の両方、IMO を検証したほうがよいでしょう。クライアント側の検証が失敗する可能性のある方法は、罪のないものも悪意のあるものもさまざまです。そうでない場合でも、サーバー側のコードを再利用できると便利です。クライアント側の Java スクリプトで。

于 2013-06-11T20:05:51.953 に答える