Spring MVC不显示表单错误

时间:2015-04-19 07:07:23

标签: java spring spring-mvc

这是我的控制器

@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();
}

这是我创建的渲染库。

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

这是我的验证器

这是我的表格。

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

在我的控制器上,绑定结果有错误。但是,错误没有显示在视图上,我错过了什么?

1 个答案:

答案 0 :(得分:0)

问题在于构建ModelAndView的方式,您应该使用Errors对象来构造它。使用Errors.getModel()获取代表模型的基础Map,并使用视图名称旁边的ModelAndView构建@ModelAttribute

除了您的其他模型属性之外,您应该只需添加GET带注释的方法来检索它们。我还建议您添加基于@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()); } 的方法,并在成功提交后重定向到该方法。

您的帮助程序类似乎也毫无意义,因为只需在控制器内部进行操作即可简化代码(imho)。

您的控制器可以看到这些内容。

{{1}}
相关问题