【问题标题】:Spring MVC form:errors not displaying errorSpring MVC 表单:错误不显示错误
【发布时间】:2014-03-28 01:03:11
【问题描述】:

我查看了有关此主题的其他帖子,但无法使其正常工作。这似乎是一个简单的问题。如果有人可以提供帮助,我将不胜感激。

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

【问题讨论】:

    标签: java spring


    【解决方案1】:

    您正在执行重定向

    mav = new ModelAndView("redirect:/spring/person/list", "person", person);
    

    您的errors 存储在模型中,随后存储在HttpServletRequest 属性中。这些仅持续一个请求的持续时间。重定向会导致客户端发送 new 请求。因此,当您的重定向视图被渲染时,它们不存在。

    考虑使用 flash 属性。查看RedirectAttributes。这就是 POST-REDIRECT-GET 通常的工作方式。

    【讨论】:

    • 你能说得更清楚些吗?我尝试使用字符串重定向,它也不起作用(实际上这就是我尝试使用 ModelAndView 的原因。@RequestMapping(value = "add", method = RequestMethod.POST) public String addPerson( @ModelAttribute("person") @Valid Person person, BindingResult 结果) {
    • @user3260768 我不知道如何更明确。 A redirect causes the client to send a new request. 您不能为此依赖 HttpServletRequest 或模型属性。使用RedirectAttributes
    • 我的 Eclipse 没有找到 RedirectAttributes 类。我正在使用 3.0.5.RELEASE spring mvc。
    • @user3260768 该类是在 3.1 中添加的。如果您无法升级,this blog post 将向您展示如何实现自己的闪存范围。
    • 我将 spring 升级到 3.1.0.RELEASE。我的jsp页面中仍然没有显示错误。这可能是非常简单的事情。我就是想不通。 public String addPerson(@ModelAttribute("person") @Valid Person person, BindingResult result, RedirectAttributes redirectAttrs) { personValidator.validate(person, result); if (result.hasErrors()) { redirectAttrs.addAttribute("person", person.getId()).addFlashAttribute("message", "duplicate person!");返回“重定向:/spring/person/list”; } personService.addPerson(person);返回“重定向:/spring/person/list”;
    【解决方案2】:

    你的person bean是什么样子的?你那里也有验证注释吗?请粘贴字段。

    试试这个:

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

    【讨论】:

    • 我刚刚添加了 Person.java。理想情况下,我想使用字符串重定向(请参阅我更新的源代码)。
    • 我确实尝试了您的建议。它没有用。 /spring/person/list 是包含输入名字和姓氏的表单以及来自 db 的人员列表的视图。如果表单输入成功并保存到数据库,我想用新的人员记录再次显示/spring/person/list(该方法从数据库检索记录并返回“人员”以获取人员.jsp)页面,否则我想在同一页面 /spring/person/list 和 person.jsp 的输入上方显示一些错误。
    猜你喜欢
    • 2011-02-21
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多