使用Spring 3验证向导页面

Rya*_*yan 4 validation spring spring-mvc wizard

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

然后我进一步挖了一下,找到了如何用Spring 3做类似的事情.这个例子虽然没有做任何类型的验证(例如via @Valid),所以我想知道如何验证向导的每一步?

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

谢谢你的帮助.

(PS:不需要WebFlow的解决方案将是理想的.)

Jef*_*eff 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 {}
}
Run Code Online (Sandbox Code Playgroud)

您可以通过提供标记接口来表示向导步骤,从而利用JSR-303支持验证组的事实.

然后,不是依赖@Valid注释,而是将Validator实例注入控制器并调用:

validator.validate(user, /*<step interface>.class*/);
Run Code Online (Sandbox Code Playgroud)

在您的processPage方法(引用链接问题中的Controller),然后

validator.validate(user, FinalStep.class);
Run Code Online (Sandbox Code Playgroud)

在你的processFinish电话中.