不确定我做错了什么 - 但在我提交没有任何价值的人格后
我无法在html输出中看到任何验证错误。
当我在控制器中添加断点时,我能够看到"错误"
所以它会结果.hasErrors()试图添加* form:errors path =" *" - 依然没有
但是表格上仍然没有错误。
获取方法:
人员类是没有注释的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;
}
发布保存新人的方法
@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>
答案 0 :(得分:3)
ModelAndView modelAndView = new ModelAndView("personAdd");
这一行构造了一个新的ModelAndView
,并通过这样做来解除当前模型。您只在此后的行中添加对象,但您已经有效地破坏了已有的绑定结果。如果您在BindingResult
s的模型中使用此构造传递。而且您不必再添加模型对象,因为它已经包含在内。
ModelAndView modelAndView = new ModelAndView("personAdd", result.getModel());
然而,在注释驱动@Controller
的情况下,您不必返回ModelAndView
,在这种情况下,简单的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
添加到模型属性参数和include a @InitBinder
annotated method来应用自动验证。
@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);
}
答案 1 :(得分:1)
尝试进行此配置:
@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";
}
// ...
}
把它放在你的班级
中@NotNull
String personName;
并且不要忘记将其放在Spring XML文件中,或者放在Java配置中
<mvc:annotation-driven/>
所有这些都将进行验证