【问题标题】:Spring MVC (Neither BindingResult nor plain target object for bean name) after Form Validation error表单验证错误后的 Spring MVC(既不是 BindingResult 也不是 bean 名称的普通目标对象)
【发布时间】:2013-04-03 18:26:17
【问题描述】:

我遇到了一个模型属性的问题,它在表单验证后似乎“消失”了:

public class QuestionController {
    //...
    @RequestMapping(value="/get", method=RequestMethod.GET)
    public String prepareVoterBean(Model model, @RequestParam String voterID) {
        ...
        VoterBean questions = service.getQuestionBean(voterID);
        model.addAttribute("questions", questions);
        return "questionPage";
    }

    @RequestMapping(method=RequestMethod.POST)
    public String processSubmit(@Valid VoterBean questions, BindingResult result) {
        if (result.hasErrors()) {
            logger.info("QuestionController encountered form errors ");
            return "questionPage";
        }
        return "redirect:/ballot/get";
       }

以下是 questionPage.jsp,其中 BindingResult 和 bean 名称(“问题”)的普通目标对象都没有发生:

<form:form modelAttribute="questions" method="post">
    <fieldset>      
        <legend>Security Questions</legend>
        <p>
            <form:label for="birthDate" path="birthDate" cssErrorClass="error"> <fmt:message key="questions.birthDate"/>: </form:label></br>
            <form:input path="birthDate" /><form:errors path="birthDate"/>
        </p>
        //...

questionPage 使用 HTTP get 请求渲染得很好,但是当我提交带有验证错误的表单时,从而触发 processSubmit() 返回 questionPage,我有 BindingResult 错误。我对自己做错了什么感到非常困惑,因为我的问题 bean 在第一次返回时必须可供 questionPage 使用,但是在带有验证错误的 HTTP POST 请求之后页面突然找不到 bean .非常感谢您的帮助。谢谢。

【问题讨论】:

  • questions 在您返回questionPage 后不再存在于模型中。您必须在 if (result.hasErrors()) 块中再次添加它。模型属性与请求一样长。

标签: java spring jsp spring-mvc


【解决方案1】:

如果您希望 bean 自动返回到地图上,您需要通过注释方法参数来告诉 Spring 使用地图中的 bean 作为绑定目标:

@RequestMapping(method=RequestMethod.POST)
public String processSubmit(@Valid @ModelAttribute("questions") VoterBean questions, BindingResult result) {
    if (result.hasErrors()) {
        logger.info("QuestionController encountered form errors ");
        return "questionPage";
    }
    return "redirect:/ballot/get";
   }

【讨论】:

  • 像魅力一样工作!谢谢
  • 我遇到了完全相同的问题,并在我的 JSP 中的帐户所在的位置添加了 @ModelAttribute("account"):
    修复了验证失败的错误信息问题。现在验证失败时,您将返回原始表单页面,并查看验证错误消息。感谢您对阿尔夫的帮助。
【解决方案2】:

我遇到了完全相同的问题并添加: @ModelAttribute("账户") 我的 JSP 中的帐户在哪里:

 <sf:form method="post" action="${pageContext.request.contextPath}/register" commandName="account"> 

修复了验证失败的错误信息的问题。 现在验证失败时,您将返回原始表单页面,并查看验证错误消息。感谢您对阿尔夫的帮助。

如果有兴趣,这是我的控制器:

@RequestMapping("/createaccount")
public String createAccount(Model model) {

    model.addAttribute("account", new Identity());

    return "createaccount";
}

@RequestMapping(value="/register", method=RequestMethod.POST)
public String doRegister(Model model, @Valid @ModelAttribute("account") Identity account, BindingResult result) {

    if(result.hasErrors()) {
        System.out.println("failed");
        return "createaccount";
    }

    //offersService.create(offer);
    System.out.println("success");

    return "accountSuccess";
}

【讨论】:

    猜你喜欢
    • 2013-05-23
    • 2020-11-16
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    相关资源
    最近更新 更多