简体   繁体   中英

unable to display spring mvc validation errors

I am learning spring mvc and got stuck in displaying validation error messages under textfields in spring mvc.
Here is the controller. In updateUser() method i want to code validation errors.

@Controller
public class ReportsController {

@Autowired
private ReportsDAO reportsDAO;

@Autowired
MyValidationUtils myValidationUtils;

public void setReportsDAO(ReportsDAO reportsDAO) {
    this.reportsDAO = reportsDAO;
}

@RequestMapping(value="/reports",method=RequestMethod.GET)
public ModelAndView report(){
    List<User> userList=reportsDAO.showAll();
    ModelAndView modelAndView=new ModelAndView();
    modelAndView.setViewName("Reports");
    modelAndView.addObject("userList", userList);
    modelAndView.addObject("User", new User());
    return modelAndView;
}

@RequestMapping(value="/update/{id}", method=RequestMethod.GET)
public ModelAndView reportUpdate(@PathVariable("id") String id){
    User user=reportsDAO.showByUCode(id);
    List<User> userList=reportsDAO.showAll();
    ModelAndView modelAndView=new ModelAndView();
    modelAndView.setViewName("Reports");
    modelAndView.addObject("userList", userList);
    modelAndView.addObject("User", user);
    if(user!=null){
        modelAndView.addObject("editUser", user);
    }
    return modelAndView;
}
@RequestMapping(value="/delete/{id}", method=RequestMethod.GET)
public ModelAndView reportDelete(@PathVariable("id") String id){
    int result=reportsDAO.deleteByID(id);
    ModelAndView modelAndView=new ModelAndView();
    modelAndView.setViewName("redirect:/reports");
    return modelAndView;
}

@InitBinder
protected void initBinder(WebDataBinder binder) {
    binder.setValidator(myValidationUtils);
}


@RequestMapping(value="/reportUpdate",method=RequestMethod.POST)
public ModelAndView updateUser(@ModelAttribute @Validated User user,BindingResult results,RedirectAttributes redirectAttributes){

    ModelAndView modelAndView=new ModelAndView();
    if(results.hasErrors()){
        modelAndView.setViewName("Reports");
        modelAndView.addObject("User", user);
        results.rejectValue("name", "Name cannot be empty.");
        return modelAndView;
    }
    if(user!=null){
        int result=reportsDAO.updateByCode(user);
        if(result!=-1){
            modelAndView.setViewName("redirect:/reports");
        }else{
            modelAndView.setViewName("Reports");
            modelAndView.addObject("message", "Unable to edit, Please try again.");
        }
    }else{
        modelAndView.setViewName("Reports");
        modelAndView.addObject("message", "Unable to edit, Please try again.");
    }

    return modelAndView;
}
}  

here is the jsp form.

<form:form action="/ORMWebApp/reportUpdate" modelAttribute="User"
            method="post" class="form-style-9">
            <ul>
                <li><%-- <form:label path="ucode">UCODE</form:label> --%> <form:input type="hidden" path="ucode"
                         class="field-style field-full align-none"
                        placeholder="UCode" value="${editUser.ucode}" /> <form:errors
                        path="ucode" class="field-style field-full align-none"></form:errors></li>

                <li>
                <spring:bind path="name">
                <form:label path="name">NAME</form:label> <form:input type="text" path="name"
                         class="field-style field-full align-none"
                        placeholder="Name" value="${editUser.name}" /> <form:errors
                        path="name" class="field-style field-full align-none"></form:errors></spring:bind></li>
                <li>
                <spring:bind path="email">
                <form:label path="email">EMAIL</form:label> <form:input type="email" path="email"
                         class="field-style field-full align-none"
                        placeholder="Email" value="${editUser.email}" /> <form:errors
                        path="email" class="field-style field-full align-none"></form:errors></spring:bind></li>
                <li>
                <spring:bind path="address">
                <form:label path="address">ADDRESS</form:label> <form:input type="text"
                        path="address" 
                        class="field-style field-full align-none" placeholder="Address"
                        value="${editUser.address}" /> <form:errors path="address"
                        class="field-style field-full align-none"></form:errors></spring:bind></li>
                <li>
                <spring:bind path="password">
                <form:label path="password">PASSWORD</form:label> <form:input type="password"
                        path="password" 
                        class="field-style field-full align-none" placeholder="Password"
                        value="${editUser.password}" /> <form:errors path="password"
                        class="field-style field-full align-none"></form:errors></spring:bind></li>
                <li>
                <spring:bind path="about">
                <form:label path="about">ABOUT</form:label> <form:textarea path="about"
                         class="field-style" placeholder="About" ></form:textarea>
                        <form:errors path="about"
                        class="field-style field-full align-none"></form:errors></spring:bind></li>
                <li><input type="submit" value="UPDATE" /></li>
            </ul>
        </form:form>  

Here is validation utils class.

public class MyValidationUtils implements Validator{

@Override
public boolean supports(Class<?> arg0) {

    return User.class.equals(arg0);
}

@Override
public void validate(Object target, Errors errors) {

    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "NotNull.user.name", "Name cannot be blank.");
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "address", "NotNull.user.address", "Address cannot be blank.");
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "email", "NotNull.user.email", "email cannot be blank.");
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "NotNull.user.password", "password cannot be blank.");
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "about", "NotNull.user.about", "About cannot be blank.");

}
}    

is something i am missing in this to return validation errors in form. Thanks in advance.

the problem was that i was not binding model attribute properly and not returning result either. This works for me.

@RequestMapping(value="/reportUpdate",method=RequestMethod.POST)
public ModelAndView updateUser(@ModelAttribute("User") @Validated User user,BindingResult results,RedirectAttributes redirectAttributes){

    ModelAndView modelAndView=new ModelAndView();
    //myValidationUtils.validate(user, results);
    if(results.hasErrors()){
        return new ModelAndView("Reports", "User", user);
    }
    if(user!=null){
        int result=reportsDAO.updateByCode(user);
        if(result!=-1){
            modelAndView.setViewName("redirect:/reports");
        }else{
            modelAndView.setViewName("Reports");
            modelAndView.addObject("message", "Unable to edit, Please try again.");
        }
    }else{
        modelAndView.setViewName("Reports");
        modelAndView.addObject("message", "Unable to edit, Please try again.");
    }

    return modelAndView;
}

and have to write this in MyValidationUtils.

@Override
public void validate(Object target, Errors errors) {
    User user=(User)target;
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "NotNull.user.name", "Name cannot be blank.");
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "address", "NotNull.user.address", "Address cannot be blank.");
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "email", "NotNull.user.email", "email cannot be blank.");
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "NotNull.user.password", "password cannot be blank.");
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "about", "NotNull.user.about", "About cannot be blank.");

}

and put a messages.properties in resource folder.

NotNull.user.name=Please fill name.
NotNull.user.address=Please fill address.
NotNull.user.email=Please fill email.
NotNull.user.password=Please fill password.
NotNull.user.about=Please fill about.

and make a bean in dispatcher-servlet.

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename">
        <value>messages</value>
    </property>
</bean>
<bean id="myValidationUtils" class="org.apedusoft.validator.MyValidationUtils"></bean>

And it returns values in the messages.properties file. But due to some jsp form bug by my side. the validation error message is returning twice for name only but working fine for email and etc.

Based on Spring docs, the default model attribute name is inferred from the declared attribute type (ie the method parameter type or method return type).

So, going back to your original code @ModelAttribute @Validated User user , this attribute will be named user . And the problem is that in your jsp you have <form modelAttribute="User" (capital U).

In your answer you've submitted the code where you have explicitely set the model name to "User", and that's the reason why it worked: @ModelAttribute("User") @Validated User user

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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