spring 形式的包装验证

Validation of wrapper in spring form

我已经将两个我想以一种形式使用的对象包装起来。这是包装器 class:

public class UserCustomer {
    User user;
    Customer customer;
    //Getters and setters
    //Constructors

控制器:

@Controller
public class RegisterController {
    @RequestMapping("/register")
    public String showRegister(Model model){
        model.addAttribute("userCustomer", new UserCustomer(new User(), new Customer()));
        return "register";
    }

    @RequestMapping(value="/doRegister", method = RequestMethod.POST)
    public String doRegister(Model model, @Valid UserCustomer userCustomer, BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            return "register";
        }
        System.out.println(userCustomer.getUser());
        return "registered";
    }
}

和表格:

        <h3 class="new-models">For New Customers</h3>
        <div class="register">
            <sf:form method="post" action="${pageContext.request.contextPath}/doRegister" commandName="userCustomer">
                <div class="register-top-grid">
                    <h3>PERSONAL INFORMATION</h3>
                    <div>
                        <span>First Name<label>*</label></span>
                        <sf:errors path="customer.name" cssClass="alert-danger"/>
                        <sf:input name="name" type="text" path="customer.name"/>
                    </div>
                    <div>
                        <span>Last Name<label>*</label></span>
                        <sf:errors path="customer.surname" cssClass="alert-danger"/>
                        <sf:input name="surname" type="text" path="customer.surname"/>
                    </div>
                    <div>
                        <span>Email Address<label>*</label></span>
                        <sf:errors path="user.email" cssClass="alert-danger"/>
                        <sf:input name="email" type="text" path="user.email"/>
                    </div>
                    <div>
                        <span>Username<label>*</label></span>
                        <sf:errors path="user.username" cssClass="alert-danger"/>
                        <sf:input name="username" type="text" path="user.username"/>
                    </div>
                    <div class="clearfix"> </div>
                    <!--a class="news-letter" href="#">
                        <label class="sf:checkbox">
                            <!--sf:input type="checkbox" name="newsletter" path="customer.newsletter" checked=""/><i> </i>Sign Up for Newsletter</label>
                    </a-->
                    <a class="news-letter" href="#"></a>
                </div>
                <div class="register-bottom-grid">
                    <h3>LOGIN INFORMATION</h3>
                    <div>
                        <span>Password<label>*</label></span>
                        <sf:errors path="user.password" cssClass="alert-danger"/>
                        <sf:input name="password" type="password" path="user.password"/>
                    </div>
                    <div>
                        <span>Confirm Password<label>*</label></span>
                        <sf:input type="password" path=""/>
                    </div>
                </div>
                <div class="clearfix"> </div>
                <div class="register-but">
                    <input type="submit" value="register">
                    <div class="clearfix"> </div>
                </div>
            </sf:form>
        </div>

一切似乎都工作正常,除了验证。我真的不知道如何在这个包装器中进行验证。

用户 class 中的电子邮件验证示例:

@Pattern(regexp = ".*\@.*\..*")

我自己解决了这个问题,它比我预期的要简单得多。

只需在包装器中的用户和客户字段上方添加 @Valid 注释即可进行验证,因此 spring 知道实际验证它们 "deeper".