Spring 3 MVC - form:errors not showing the errors

2020-01-31 01:58发布

问题:

I am using annotation based validation but for one of the forms I am not able to show any errors using the form:errors tag. When I debug the method, I can see the BindingResult has errors, but for some reason its not being displayed on the form. I am stumped as I have got it working on other forms, but for some reason this particular form is having issues. Any pointers are greatly appreciated.

Here is some code from the controller, I have the copyCartForm as a @SessionAttribute as well in the Controller:

@RequestMapping(params="action=Confirm Copy", method=RequestMethod.POST)
public String copyCart(@Valid CopyCart copyCartForm, BindingResult result) {
    if (result.hasErrors()) {
        logger.debug("errors in form" + result.toString());
        return "copyshoppingcart";
    } else {
                    ...
                    ...
        return "redirect:/home";
    }
}

In the JSP I have tried this:

<form:errors path="*" cssClass="formError"/>

as well as:

<form:errors path="fieldName" cssClass="formError"/>

Neither works.

回答1:

I had to use @ModelAttribute to get this working. So the form was preceded by @ModelAttribute("copyCartForm") @Valid CopyCart copyCartForm, BindingResult result)



回答2:

One more approach, If for some reason you cannot use @ModelAttribute("copyCartForm") when use follow:

@RequestMapping(method=RequestMethod.POST)
public String post(@Valid CopyCart copyCartForm, BindingResult bindingResult, ModelMap modelMap) {
    if (bindingResult.hasErrors()) {
        modelMap.put(BindingResult.class.getName() + ".copyCartForm", bindingResult);
        return "copyshoppingcart";
    }
    return "redirect:/home";
}


回答3:

I faced the same issue.

I had to use the @ModelAttribute("attributeName") to get the validation error back in response.



回答4:

I am not sure why and I suffered a lot until I figured it out, but you HAVE TO name your bean exactly as your bean class. So copyCartForm should be just copyCart.

@RequestMapping(params="action=Confirm Copy", method=RequestMethod.POST)
public String copyCart(@Valid CopyCart copyCart, BindingResult result) {
    if (result.hasErrors()) {
        logger.debug("errors in form" + result.toString());
        return "copyshoppingcart";
    } else {
                    ...
                    ...
        return "redirect:/home";
    }
}

This must also be changed on the form tag:

<form:form action="....." method="..." commandName="copyCart">