Search code examples
springformsvalidationjspspring-form

Validation of wrapper in spring form


I've wrapped two objects I wanted to use in one form. Here is the wrapper class:

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

Controller:

@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";
    }
}

And the form:

        <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>

Everything seems to be working fine, except for validation. I don't really know how to make validation in this wrapper.

Example validation for email in User class:

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

Solution

  • I have solved myself this problem, it's way more simple than I have expected it would be.

    Validation works simply by adding @Valid annotation above user and customer fields in this wrapper, so that spring knows to actually validate them "deeper".