2011-08-17 12 views
2

自然な数(つまり、正の非ゼロの整数:1,2,3、...)が含まれるはずの入力フィールドを検証しようとしています。 ...)Spring 3の検証(JSR-303)@Min

私は、次の注釈使用しています:私は私が得るように1.5などの番号を送信すると

@Digits(integer=10, fraction=0) 
@Min(value = 1) 
private Long number; 

(これは私の制約を記述するための最良の方法です???)

をa バリデーションメッセージこれは良いです。 しかし、-1などの入力を提出すると、私は検証メッセージを取得しません。何が欠けていますか?

ありがとうございます!

P.S.このフィールドの私の(他の)Hibernateアノテーションはフィールドのゲッター上にあったので、(実際のフィールド上ではなく)これらの2つのアノテーションをゲッターに移動するだけです。助けてくれなかった。

EDIT

は、私はちょうど私が私のXMLに<mvc:annotation-driven />を追加する必要があるかもしれませんお読みください。私は、しかし、私は例外を取得していますサーバーの起動中に、それをしなかった:

org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/mvc] Offending resource: ServletContext resource [/WEB-INF/dispatcher-servlet.xml]

私はそれが何を意味するのかわからないと私は実際に(????)は、アノテーション駆動型のタグが必要な場合が...私のxmlに注釈付きのタグが必要だった場合、なぜ他の注釈(検証注釈の1つを含む)もそのXMLなしで動作しましたか?

答えて

0

整数の場合は、Integerにしてください。また、@Min(1)である必要があります。

+2

私は数学的意味で整数を意味しました。 'Integer'より大きいので' Long'を使用しています。 '@Min(1)'は単に省略形であると思うので、とにかくEclipseは '@Min(value =)'を提案します。 – rapt

1

さらに、@Valid注釈を使用してバインディングポイントでBeanを検証するためにSpringを明示的に指定する必要があります。これを行うことを確認できますか? 1.5がLongフィールドに入れられず、妥当性検査例外ではなくバインディング例外であるため、入力が1.5であるというエラーが発生していると仮定しています。

+0

私はもちろん、コマンドオブジェクトに@Validアノテーションを指定しました。私のコントローラのメソッドは次のようになります: 'public ModelAndView list(HttpServletRequestリクエスト、HttpServletResponseレスポンス、@Validブック、BindingResult結果)例外をスローします。{...}'そして、NO、 '@ Digits'バインディング例外ではありません。検証を一切使用せずに、負の整数(たとえば-1)を入力すると、何も入力しなかったかのように動作します(これは問題ありません)。奇妙なことは、これらの2つのアノテーションで '@ Digits'だけが動作することです。 – rapt

+0

あなたのクラスパスにspring-webmvc jar(3.0+)が必要なため、2番目の編集を見ました。 mvc:annotation-drivenが必要な場合、JSR303のバリデーターをBeanとしてロードします。さらに私のローカルプロジェクトには、validation-api jarとhibernateの実装があります。hibernate-validator-4.1.0.Final.jarも存在します。 –

+0

ありがとう!私はすべてのSpring JARを3.0.0から3.0.5に変更しました。そして、私は@Minが今働いています。ウィリー・ウィーラーへの私のコメントを見てください。 – rapt

2

<mvc:annotation-driven />タグが必要です。 Spring Web MVCがJSR-303の検証を有効にするように指示します。

チェックするためにいくつかのこと:

1)は、あなたのdispatcher-servlet.xml configにmvc名前空間接頭辞を宣言していることを確認します。例えば、(ここでは春の3を使用して):

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 
    ... 
</beans> 

2)また、あなたのクラスパス上の春のWeb MVCのJARを持っていることを確認してください。 JARには、MVC構成名前空間を処理する方法を知っている名前空間ハンドラーが含まれています。

3)Hibernate Validatorがクラスパス上にあることを確認してください。 Springは検証を実行するためにそれを必要とします。

あなたの他の注釈がなぜ機能したかについてのご質問:<mvc:annotation-driven>はすべての注釈について責任を負いません。上記のように、それが責任を負うことの1つはJSR-303バリデーションです。

あなたの他の検証がうまくいかなかった理由については、まったく動作している検証ではないと思います。代わりに、Longに1.5を入れようとすると、Springはそれを行うことができず、おそらく何らかのエラーメッセージが表示されます。私はここに@Digits注釈が全く必要ないとは思わない。あなたがそれを取り除くと、あなたはまだメッセージを受け取ると思います。

+0

ありがとう!私は実際に(1)(2)(3)を持っていました。私が変えなければならなかったのは、瓶でした。私はすべてのSpring JARを3.0.0から3.0.5に変更しました。@Minは現在動作しています。 @Minがなぜ機能したのかを説明してくれてありがとう。あなたは '@ Digits'が必要でないことについて正しいです... 1.しかし、例外スタックトレースを見るのではなく、(むしろ素晴らしい)エラーメッセージを私に与えるメカニズムは何ですか? 2.エラーメッセージをどのように変更できますか?整数のために。 3.プリミティブの1つを検証するための通常のプラクティスは何ですか? Integerの場合のように、特定のアノテーションは必要ありませんか? – rapt

+0

4.アノテーションが何をすべきかは必ずしも明確ではありません。入力を正しい形式(可能な場合)に変換してください。 BeanがIntegerを取得しようとしているときに1.5から1に変換します。 @Minのように一致しない場合は入力を拒否してください。 例: '@ NumberFormat'は、パターンと一致しない数字を受け取り、正しいパターンに変換するようです。 '@ DateTimeFormat'はパターンと一致しない日付を拒否しますが、nadはエラーメッセージを出力します。両方ともSpringのアノテーション(JSR-303ではなく)ですが。私は、関連するウェブページへの説明および/または参考に感謝します。 – rapt

関連する問題