使用Spring 3验证向导页面

时间:2011-07-18 19:16:32

标签: spring validation spring-mvc wizard

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

然后我再挖了一下,发现how to accomplish something similar with Spring 3。这个例子没有做任何类型的验证(例如通过@Valid),所以我想知道如何验证向导的每一步?

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

感谢您的帮助。

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

2 个答案:

答案 0 :(得分: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注释,而是将Validator实例注入控制器并调用:

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

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

validator.validate(user, FinalStep.class);
在你的processFinish电话中

答案 1 :(得分:4)

使用 @Validated

来自Spring的文档:

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