我开始研究如何在Spring中为类似向导的表单创建一个控制器,并且遇到了AbstractWizardFormController,我很快注意到它已被弃用。
然后我再挖了一下,发现how to accomplish something similar with Spring 3。这个例子没有做任何类型的验证(例如通过@Valid
),所以我想知道如何验证向导的每一步?
每个步骤都有可能有自己的支持Form对象,然后使用@SessionAttributes
存储它们的值,以便在调用最终提交时(可能在表单的最后一页)?
感谢您的帮助。
(P.S。:不需要WebFlow的解决方案将是理想的。)
答案 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的方法验证。也可以用作自定义构造型注释或自定义组特定验证注释的元注释。