我已经看过关于这个主题的其他帖子,但无法让它发挥作用。这似乎是一个简单的问题。如果有人可以提供帮助,我将不胜感激。
@Entity
@Table(name = "PERSON")
public class Person {
@Id
@Column(name = "PERSON_ID")
private int id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
public Person() {
}
public Person(String fname, String lname) {
this.firstName = fname;
this.lastName = lname;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String first_name) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName(String last_name) {
this.lastName = last_name;
}
}
@Controller
@RequestMapping("person")
public class PersonController {
@RequestMapping(value = "add", method = RequestMethod.POST)
public String addPerson(
@ModelAttribute("person") @Valid Person person, BindingResult result) {
log.info("in add");
personValidator.validate(person, result);
if (!result.hasErrors())
personService.addPerson(person);
return "redirect:/spring/person/list";
}
<body>
<form:form method="post" action="add.html" commandName="person">
<form:errors path="*" cssClass="errorblock" />
<table>
<tr>
<td><form:label path="firstName">First name</form:label></td>
<td><form:input path="firstName" /></td>
<td><form:errors path="*" cssClass="error" /></td>
</tr>
<tr>
<td><form:label path="lastName">Last name</form:label></td>
<td><form:input path="lastName" /></td>
<td><form:errors path="*" cssClass="error" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="Add" /></td>
</tr>
</table>
</form:form>
</body>
</html>
@Component
public class PersonValidator implements Validator {
public void validate(Object arg0, Errors arg1) {
Person person = (Person) arg0;
if (personService.findPersonByName(person.getFirstName(), person.getLastName()) != null)
arg1.rejectValue("firstName", "first name empty");
//arg1.reject("save.person", "User already exists.");
}
}
personService.findPersonByName不为null且result.hasErrors()为true,因此我知道表单有错误,但由于某些原因它们不显示。
答案 0 :(得分:4)
您正在执行重定向
mav = new ModelAndView("redirect:/spring/person/list", "person", person);
您的errors
存储在模型中,随后存储在HttpServletRequest
属性中。这些仅在一个请求的持续时间内持续。重定向会导致客户端发送新请求。因此,在渲染重定向视图时,它们不存在。
考虑使用flash属性。看看RedirectAttributes
。这就是POST-REDIRECT-GET通常的工作原理。
答案 1 :(得分:0)
你的人豆怎么样?你有验证注释吗?请粘贴字段。
试试这个:
@RequestMapping(value = "add", method = RequestMethod.POST)
public ModelAndView addPerson(
@ModelAttribute("person") @Valid Person person, BindingResult result) {
ModelAndView mav;
log.info("in add");
personValidator.validate(person, result);
if (result.hasErrors()) {
mav = new ModelAndView("your view here");
mav.addObject("person", person);
return mav;
}
personService.addPerson(person);
mav = new ModelAndView("redirect:/spring/person/list", "person", person);
return mav;
}
如果有任何错误,我们要将bean添加到mav并再次显示视图。 (如果你也在bean中得到验证,错误将显示在jsp上)否则将创建该人并重定向..
正如您现在所知,由于重定向,无法显示错误消息。因此,我们希望将bean添加到视图中并再次显示视图。