Spring MVC表单:错误不显示错误

时间:2014-02-25 16:35:50

标签: java spring

我已经看过关于这个主题的其他帖子,但无法让它发挥作用。这似乎是一个简单的问题。如果有人可以提供帮助,我将不胜感激。

Person.java

@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;
}
}

PersonController.java

@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";
}

person.jsp

<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>

PersonValidator.java

@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,因此我知道表单有错误,但由于某些原因它们不显示。

2 个答案:

答案 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添加到视图中并再次显示视图。