2011-07-18 11 views
4

Springでウィザードのようなフォーム用のコントローラを作成する方法を研究し始め、AbstractWizardFormControllerを見つけました。Spring 3でウィザードページを検証する

私はさらにビットを掘り、how to accomplish something similar with Spring 3を見つけました。この例では検証は一切行っていません(例:@Valid経由)ので、ウィザードの各ステップをどのように検証するのでしょうか?

各ステップに固有のバッキングフォームオブジェクトがあり、最後のサブミットが呼び出されたとき(おそらくフォームの最後のページにある)の値を保存するには、@SessionAttributesを使用しますか?

ありがとうございました。

(PS:のWebflowを必要としないソリューションは理想的である。)

答えて

5

私は@Valid注釈でこれをやってのけるする方法を知っていませんが、あなたはの利点を取ることができるはずですこれを達成するためのJSR-303検証。やや不自然な例として:

public class User { 
    @NotNull(message = "First name can't be blank", groups = {Step1.class, FinalStep.class}) 
    private String firstName; 

    @NotNull(message = "Last name can't be blank", groups = {Step1.class, FinalStep.class}) 
    private String lastName; 

    @NotNull(message = "Email can't be blank", groups = {Step1.class, FinalStep.class}) 
    private String emailAddress; 

    @NotNull(message = "Please provide a valid address", groups = {Step2.class, FinalStep.class}) 
    private Address address; 

    // getters/setters... 

    public interface Step1 {} 
    public interface Step2 {} 
    public interface FinalStep {} 
} 

あなたはJSR-303はあなたのウィザードの手順を表現するために、マーカーインターフェイスを提供することで、検証グループをサポートしているという事実を利用することができます。そして

、代わりの@Valid注釈に依存する、あなたのコントローラにバリデータインスタンスを注入し、呼び出し:あなたprocessPageメソッドで

validator.validate(user, /*<step interface>.class*/); 

を(あなたのリンクされた問題のコントローラを参照)、その後

validator.validate(user, FinalStep.class); 

あなたのprocessFinishコールで。

+0

人々が知っているように、このアプローチにはわずかな問題があります。 Springのvalidate()メソッドでJSR-303グループを使用することはできません。検証されるObjectとBindingResultだけを引数としてとります。 – Ryan

4

@Validated。検証グループの仕様をサポートするJSR-303の有効なの

バリアント、:春のドキュメントから

。 SpringのJSR-303サポートでは便利ですが、JSR-303ではサポートされていません。 などを使用できます。 Spring MVCハンドラメソッドの引数を使用します。 SmartValidatorの検証ヒントのコンセプトによってサポートされ、検証グループクラスがヒントオブジェクトとして機能します。 メソッドレベルの検証でも使用できます。特定のクラスがメソッドレベルで検証されることを示します(対応する検証インターセプタのポイントカットとして機能します)。オプションで、メソッドレベル検証の検証グループを指定します。注釈付きクラス。このアノテーションをメソッドレベルで適用すると、特定のメソッドの検証グループをオーバーライドできますが、ポイントカットとしては機能しません。それにもかかわらず、特定のBeanのメソッド検証をトリガーするには、クラスレベルの注釈が必要です。また、カスタムステレオタイプアノテーションまたはカスタムグループ固有の検証済みアノテーションのメタアノテーションとしても使用できます。

関連する問題