Spring MVC not displaying form errors

Here's my controller

@RequestMapping(value = "/save",method = RequestMethod.POST)
public ModelAndView saveUserAccount(@ModelAttribute("account") UserAccountForm userAccount, BindingResult result){
    AddUserValidator userValidator = new AddUserValidator();
    userValidator.validate(userAccount,result);
    boolean hasErrors = result.hasErrors();
    if(hasErrors){
        return render(ADD_USER_VIEW)
            .addAttr("ACCOUNT_ROLES", Arrays.asList(AccountRole.values()))
            .addAttr("TENANTS",tenantInfoService.getAll())
            .addAttr("errors",result)
            .addAttr("account",userAccount).toMav();
    }
    return render(ADD_USER_VIEW)
        .addAttr("ACCOUNT_ROLES", Arrays.asList(AccountRole.values()))
        .addAttr("TENANTS",tenantInfoService.getAll())
        .addAttr("account",new UserAccountForm())
        .toMav();
}

      

Here is the rendering library I created.

public class RenderMavBuilder {

    private final ModelAndView mav;

    public static RenderMavBuilder render(String viewname){
        RenderMavBuilder target = new RenderMavBuilder(viewname);
        return target;
    }

    public RenderMavBuilder addAttr(String attrName, Object value){
        mav.addObject(attrName, value);
        return this;
    }

    public RenderMavBuilder addAttr(Object value){
        mav.addObject(value);
        return this;
    }

    public RenderMavBuilder addAttrs(Map<String , ?> attrs){
        mav.addAllObjects(attrs);
        return this;
    }

    private RenderMavBuilder(String viewName){
        this.mav = new ModelAndView(viewName);
    }

    public ModelAndView toMav(){
        return mav;
    }
}

      

Here's my validator

Here is my form.

        <div class="col-md-6 centered">
            <form:errors path="*" />
            <form:form commandName="account" method="post" action="${pageContext.request.contextPath}/user/save">
                <!-- Username -->
                <div class="col-xs-12 form-group">
                    <label class="control-label">Username</label>
                    <form:input path="username" type="text" class="form-control" />
                </div>
                <!-- Password -->
                <div class="col-xs-12 form-group">
                    <label class="control-label">Password</label>
                    <form:password path="password" class="form-control"/>
                </div>


                <!-- Password -->
                <div class="col-xs-12 form-group">
                    <label class="control-label">Password</label>
                    <form:password path="retypedPassword"  class="form-control"/>
                </div>

                <!-- First Name -->
                <div class="col-xs-12 form-group">
                    <label class="control-label">First Name</label>
                    <form:input path="firstName" type="text" class="form-control"/>
                </div>

                <!-- First Name -->
                <div class="col-xs-12 form-group">
                    <label class="control-label">Last Name</label>
                    <form:input path="lastName" type="text" class="form-control"/>
                </div>

                <!-- User Role -->
                <div class="col-xs-12 form-group">
                    <label class="control-label">User Role</label>
                    <form:select path="accountRole" class="form-control">
                        <form:options items="${ACCOUNT_ROLES}"/>
                    </form:select>
                </div>

                <!-- Branch Designation -->
                <div class="col-xs-12 form-group">
                    <label class="control-label">Designated Branch</label>
                    <select path="tenantId" items="${TENANTS}" class="form-control">
                        <c:forEach var="branch" items="${TENANTS}">
                            <option value="${branch.id}">${branch.tenantDescription}</option>
                        </c:forEach>
                    </select>
                </div>
                <!-- Button -->
                <div class="col-md-12 form-group">
                    <button class="form-control btn btn-primary submit-button" type="submit">Save New User <i class="fa fa-check-square-o"></i></button>
                </div>
            </form:form>

      

On my controller, the binding result has errors. however, the error is not showing in the view, what am I missing?

+3


source to share


1 answer


The problem is how you build yours ModelAndView

, you have to use an object Errors

to create it. Use Errors.getModel()

to get the base Map

that the model represents and use that next to the view name to build ModelAndView

.

Alongside this, for other attributes of the model, you should simply add @ModelAttribute

annotated methods to get them. I would also suggest adding a method GET

that you redirect after successful submission.

Your helper class seems pretty pointless as well, as having it just inside your controller will simplify your code (imho).



Your controller might look something like this.

@RequestMapping(value = "/save",method = RequestMethod.POST)
public ModelAndView saveUserAccount(@ModelAttribute("account") UserAccountForm userAccount, BindingResult result){
    AddUserValidator userValidator = new AddUserValidator();
    userValidator.validate(userAccount,result);
    boolean hasErrors = result.hasErrors();
    return new ModelAndView(hasErrors ? ADD_USER_VIEW, "redirect:/add", errors.getModel());
}

@RequestMapping(value="/add")
public String addUserAccount(Model model) {
    model.addObject("account", new UserAccountForm());
    return ADD_USER_VIEW;
}

@ModelAttribute
public void referenceData(Model model) {
    model.addObject("ACCOUNT_ROLES", Arrays.asList(AccountRole.values()));
    model.addObject("TENANTS",tenantInfoService.getAll());
}

      

0


source







All Articles