简体   繁体   English

Spring MVC不显示表单错误

[英]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's the render library That I have 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's 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 controler the binding result has errors. 在我的控制器上,绑定结果有错误。 however, the error is not being displayed on the view, what am I missing? 但是,错误没有显示在视图上,我错过了什么?

The problem is the way you are constructing your ModelAndView , you should use the Errors object to construct it. 问题是你构建ModelAndView ,你应该使用Errors对象来构造它。 Use Errors.getModel() to obtain the underlying Map that represents the model and use that, next to the view name, to construct the ModelAndView . 使用Errors.getModel()获取表示模型的基础Map ,并使用该视图名称旁边的Map来构造ModelAndView

Next to that for your other model attributes you should simply add @ModelAttribute annotated methods to retrieve those. 在其他模型属性的旁边,您只需添加@ModelAttribute注释的方法来检索它们。 I would also suggest adding a GET based method which you redirect to after successful submit. 我还建议添加一个基于GET的方法,在成功提交后重定向到该方法。

Your helper class seems also rather pointless as doing it simply inside your controller would simplify your code (imho). 您的帮助程序类似乎也毫无意义,因为只需在控制器内部进行操作就可以简化代码(imho)。

Your controller could look something along these lines. 您的控制器可以沿着这些线看。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM