使用Spring3验证向导页面

使用Spring3验证向导页面,spring,validation,spring-mvc,wizard,Spring,Validation,Spring Mvc,Wizard,我在Spring开始研究如何为类似向导的表单创建控制器,并遇到了AbstractWizardFormController,我很快注意到它被弃用了 然后我再挖了一点,找到了。不过,这个示例不进行任何类型的验证(例如,通过@Valid),因此我想知道如何验证向导的每个步骤 是否可能每个步骤都有自己的支持表单对象,然后使用@SessionAttributes存储它们的值,以便在调用最终提交时使用(可能在表单的最后一页) 谢谢你的帮助 (注:不需要WebFlow的解决方案是理想的。)我不知道用@Vali

我在Spring开始研究如何为类似向导的表单创建控制器,并遇到了AbstractWizardFormController,我很快注意到它被弃用了

然后我再挖了一点,找到了。不过,这个示例不进行任何类型的验证(例如,通过
@Valid
),因此我想知道如何验证向导的每个步骤

是否可能每个步骤都有自己的支持表单对象,然后使用
@SessionAttributes
存储它们的值,以便在调用最终提交时使用(可能在表单的最后一页)

谢谢你的帮助


(注:不需要WebFlow的解决方案是理想的。)

我不知道用@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注释,而是将验证器实例注入控制器并调用:

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

在processFinish调用中。

使用@Validated

从Spring的文档中:

JSR-303的有效变体,支持验证组规范。专为方便使用而设计,支持Spring的JSR-303,但不支持JSR-303。 例如,可以与Spring MVC处理程序方法参数一起使用。通过SmartValidator的验证提示概念提供支持,验证组类充当提示对象。
也可与方法级验证一起使用,指示特定类应在方法级进行验证(充当相应验证拦截器的切入点),但也可以选择在注释类中指定方法级验证的验证组。在方法级别应用此注释允许覆盖特定方法的验证组,但不能用作切入点;然而,类级别的注释对于触发特定bean的方法验证是必需的。也可以用作自定义原型注释或自定义特定于组的验证注释上的元注释。

正如人们所知,这种方法有一个小问题。不能将JSR-303组与Spring的validate()方法一起使用。它只接受正在验证的对象和BindingResult作为参数。
validator.validate(user, FinalStep.class);