繁体   English   中英

Spring 3 MVC:Bean名称的BindingResult和普通目标对象都不可用作请求属性

[英]Spring 3 MVC:Neither BindingResult nor plain target object for bean name available as request attribute

我是Spring 3 MVC的新手,正在尝试一个简单的验证示例。 下面是控制器类:

@Controller
public class ValidationController {

@RequestMapping(value="/input")
public String displayForm(ModelMap model){      
    model.addAttribute("empl",new Employee());
    return "input";
}

@RequestMapping(value="/validate", method = RequestMethod.POST)
public String validateForm(@Valid Employee empl, BindingResult result, ModelMap m){
    if(result.hasErrors()){
        System.out.println("Validation Failed!!!");
        return "input";
    }else{
        System.out.println("Validation Succeeded!!!");
        return "done";
    }
}
}

Employee.java

@Size(min=2,max=30)
private String name;
@NotEmpty @Email
private String email;
@NotNull @Min(18) @Max(35)
private Integer age;
@Size(min=10)
private String phone;
    // Getters and Setters

以下是input.jsp文件:

<form:form method="post" commandName="empl" action="validate">
<table>
    <tr>
        <td>
            <label for="nameInput">Name:</label>
        </td>
        <td>
            <form:input path="name" id="nameInput"/>
            <form:errors path="name" cssClass="error"></form:errors>
        </td>
    </tr>
    <tr>
        <td>
            <label for="ageInput">Age:</label>
        </td>
        <td>
            <form:input path="age" id="ageInput"/>
            <form:errors path="age" cssClass="error"></form:errors>
        </td>
    </tr>
    <tr>
        <td>
            <label for="phoneInput">Phone:</label>
        </td>
        <td>
            <form:input path="phone" id="phoneInput"/>
            <form:errors path="phone" cssClass="error"></form:errors>
        </td>
    </tr>
    <tr>
        <td>
            <label for="emailInput">Email:</label>
        </td>
        <td>
            <form:input path="email" id="emailInput"/>
            <form:errors path="email" cssClass="error"></form:errors>
        </td>
    </tr>
            <tr>
        <td colspan="2">
            <input type="submit" value="Submit">
        </td>
    </tr>
</table>
</form:form>

问题:

单击input.jsp`文件的submit button of the时,出现以下异常:

org.apache.jasper.JasperException: java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'empl' available as request attribute
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:502)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:424)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:262)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1180)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:950)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

为了解决这个问题,我更改了验证方法,如下所示:

@RequestMapping(value="/validate", method = RequestMethod.POST)
public String validateForm(@Valid Employee empl, BindingResult result, ModelMap m){
    if(result.hasErrors()){
        System.out.println("Validation Failed!!!");
        m.addAttribute("empl",new Employee());
        return "input";
    }else{
        System.out.println("Validation Succeeded!!!");
        return "done";
    }
}

现在,错误消息不再显示。

请帮助我解决此问题,以使验证错误消息显示在input.jsp屏幕中。

您需要在@Valid之前添加@ModelAttribute("empl") ,以使Spring MVC能够知道它应该使用commandName="empl"形式的输入来填充模型对象。

您的控制器方法应如下所示

public String validateForm(@ModelAttribute("empl") @Valid Employee empl, BindingResult result, ModelMap m)

当您尝试以表格形式显示错误时,Spring MVC需要引用有问题的模型。 因此,当您更改代码并添加new Employee()时,该对象上没有错误。

SO帖子有什么很好的解释@ModelAttribute不一样这个这个博客文章

采用

<form:form method="post" modelAttribute="empl" action="validate"></form> 

以形式代替

<form:form method="post" commandName="empl" action="validate">

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM