0

不知道我做错了什么 - 但是在我提交没有任何值的人员表单后,我
无法在 html 输出中看到任何验证错误。


当我在控制器中添加断点时,我能够看到“错误”
所以它会出现 result.hasErrors() 尝试添加 * form:errors path="*" - 仍然没有
,但表单上仍然没有错误.

Get 方法:
Person 类是一个没有注解的 POJO。

@RequestMapping(value="/person/add" , method = RequestMethod.GET)
public ModelAndView personAdd() {       
    ModelAndView modelAndView = new ModelAndView("personAdd");
    Person person = new Person();
    person.setCreationDate(new Date());
    modelAndView.addObject(person);
    return modelAndView;
}

post方法保存新人

@RequestMapping(value="/person/add" , method = RequestMethod.POST)
public ModelAndView processSubmit(@ModelAttribute("person") Person person,BindingResult result) {

personValidator.validate(person, result);

if (result.hasErrors()) {
    ModelAndView modelAndView = new ModelAndView("personAdd");          
    modelAndView.addObject(person);         
    return modelAndView;
} else {
    ModelAndView modelAndView = new ModelAndView("refreshParent");                      
    dao.persist(person);            
    return modelAndView;
}
}   

personValidator:

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

    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "personName","required.personName", "Name is required.");

Person 表单(为简单起见,只有名称)

<form:form method="POST" modelAttribute="person" action="${pageContext.request.contextPath}/person/add">
<form:errors path="*" cssClass="errorblock" element="div"/>
<form:errors path="*" />
      <div class="form-group">
         <label class="control-label" for="inputError">Person Name:</label>  
        <form:input path="personName" class="form-control" placeholder="personName"/>
        <form:errors path="personName" cssClass="error" />
    </div>
<form:form>
4

2 回答 2

3
ModelAndView modelAndView = new ModelAndView("personAdd");          

此行构造 aa newModelAndView并通过这样做您解除当前模型。您仅在此之后的行中添加对象,但您有效地破坏了已经可用的绑定结果。如果您使用此构造,则从BindingResults 传入模型。而且您不必再添加模型对象,因为它已经包含在内。

ModelAndView modelAndView = new ModelAndView("personAdd", result.getModel());          

但是,使用注释驱动@Controller,您不必返回 aModelAndView在这种情况下,一个简单的String就足够了。

@RequestMapping(value="/person/add" , method = RequestMethod.POST)
public ModelAndView processSubmit(@ModelAttribute("person") Person person,BindingResult result) {

    personValidator.validate(person, result);

    if (result.hasErrors()) {
        return "personAdd";
    } else {        
        dao.persist(person);            
        return "refreshParent";
    }
}   

这将呈现正确的视图并保持当前模型(包含错误)完好无损。

您甚至可以通过添加@Valid到模型属性参数并包含带@InitBinder注释的方法来应用自动验证。

@RequestMapping(value="/person/add" , method = RequestMethod.POST)
public ModelAndView processSubmit(@Valid @ModelAttribute("person") Person person,BindingResult result) {

    if (result.hasErrors()) {
        return "personAdd";
    } else {        
        dao.persist(person);            
        return "refreshParent";
    }
}   

@InitBinder
public void initBinder(WebDataBinder dataBinder) {
    dataBinder.setValidator(personValidator);
}
于 2014-07-03T13:27:15.810 回答
1

Try to put this configuration:

@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)
public String processSubmit(@Valid @ModelAttribute("pet") Pet pet, BindingResult result) {

    if (result.hasErrors()) {
        return "petForm";
    }

    // ...

}

And put this in your person class

@NotNull
String personName;

And do not forget to place in your Spring XML file or the same but in your java configuration

<mvc:annotation-driven/>

All this will do the validation

于 2014-07-03T13:08:38.737 回答