SpringMVC 错误:Bean 名称“用户”的 BindingResult 和普通目标对象都不能用作请求属性

Posted

技术标签:

【中文标题】SpringMVC 错误:Bean 名称“用户”的 BindingResult 和普通目标对象都不能用作请求属性【英文标题】:SpringMVC error: Neither BindingResult nor plain target object for bean name 'user' available as request attribute 【发布时间】:2012-07-20 13:31:36 【问题描述】:

环境:SpringMVC Maven Netbeans Glassfish

严重:Bean 名称“用户”的 BindingResult 和普通目标对象都不能用作请求属性 java.lang.IllegalStateException:Bean 名称“用户”的 BindingResult 和普通目标对象都不能用作请求属性 在 org.springframework.web.servlet.support.BindStatus.(BindStatus.java:141) 在 org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:178) 在 org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:198) 在 org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:164) 在 org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.autogenerateId(AbstractDataBoundFormElementTag.java:151) 在 org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.resolveId(AbstractDataBoundFormElementTag.java:142) 在 org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.java:126) 在 org.springframework.web.servlet.tags.form.AbstracthtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:421) 在 org.springframework.web.servlet.tags.form.InputTag.writeTagContent(InputTag.java:142) 在 org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:102) 在 org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:79) 在 org.apache.jsp.user_jsp._jspx_meth_form_input_0(user_jsp.java:178) 在 org.apache.jsp.user_jsp._jspx_meth_form_form_0(user_jsp.java:120) 在 org.apache.jsp.user_jsp._jspService(user_jsp.java:76) 在 org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 在 org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:403) 在 org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492) 在 org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 在 org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 在 org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) 在 org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 在 com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98) 在 com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162) 在 org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) 在 com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174) 在 com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828) 在 com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725) 在 com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019) 在 com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225) 在 com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 在 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 在 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 在 com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 在 com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 在 com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 在 com.sun.grizzly.ContextTask.run(ContextTask.java:71) 在 com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 在 com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 在 java.lang.Thread.run(Thread.java:722)

user.jsp:

    <form:form action="createuser.do" modelAttribute="user" method="POST">
        <table align="center" >
            <tr>
                <td>User Name :</td>
                <td><form:input path="userName"/></td>
            </tr>
            <tr>  
                <td><input type="submit" value="Submit" /></td>
            </tr>
        </table>
    </form:form>

我的控制器:

@Controller
public class UserController 
    @RequestMapping(value = "/createuser.do", method = RequestMethod.POST)
    public void create(@ModelAttribute("user")  User user, BindingResult result) 
        System.out.print("user name: "+user.getUserName());
    

当我访问“http://localhost:8080/NBGFMN/user.jsp”时,浏览器出现此错误 java.lang.IllegalStateException:Bean 名称“用户”的 BindingResult 和普通目标对象都不能用作请求属性

如果我从 jsp 中删除 form:input path="userName"),jsp 会正确显示,当我单击提交按钮时控制台输出“用户名:null”。

*** 中有很多关于同样错误的帖子,但没有一个解决方案适合我。

我添加了以下GET方法和welcome.jsp

@RequestMapping(value = "/welcome.do", method = RequestMethod.GET)
public ModelAndView printHello()

    ModelAndView m = new ModelAndView("welcome");
    m.addObject("ppp", "hello");
    return m;


<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <c:out value="$ppp" ></c:out>
    </body>
</html>

然后访问“http://localhost:8080/NBGFMN/welcome.do”就完美了。

我添加了以下 GET(创建用户),它可以工作:

@RequestMapping(value = "/createuser.do", method = RequestMethod.GET)
public String create(ModelMap mm) 

    mm.addAttribute("auser", new User("Andy"));
    return "welcome";


<body>
    <c:out value="$auser.userName" ></c:out>
</body>

我访问“http://localhost:8080/NBGFMN/createuser.do”,浏览器输出“Andy”

但表单 POST 仍然无法正常工作。

【问题讨论】:

您可以添加GEThandler 吗?您是在此处添加模型属性还是通过 @ModelAttribute("user") 注释方法添加模型属性? 您好,我添加了以下GET方法和welcome.jsp,效果很好。至于@ModelAttribute("user"),是的,我有。我在网上搜索了这条错误消息,看到所有人都在谈论它,但它对我不起作用。我试过 SpringMVC-3.0.7 和最新的 3.1.2,还是不行 【参考方案1】:

您是否尝试在名称为 userGET 处理程序中设置请求属性并为包含字段 userName 的某些对象赋值?像这样:

@Controller
public class UserController 

    @RequestMapping(value = "/createuser.do", method = RequestMethod.GET)
    public void create(ModelMap mm) 
        mm.addAttribute("user", new UserFormObject());
    

    @RequestMapping(value = "/createuser.do", method = RequestMethod.POST)
    public void create(@ModelAttribute("user") User user, BindingResult result) 
        System.out.print("user name: "+user.getUserName());
    

在您的 JSP 中,您需要为您的 form:form 元素指定 method=post,default method is GET,它与您的处理程序不匹配。

【讨论】:

我添加了以下 GET 方法(创建用户),它可以工作 尝试在form:form 元素中指定method=post,默认方法是GET,这与您的处理程序不匹配。 我很抱歉我实际上在表单中有 method="POST"。最后我创建了这么多测试用例,当我在这里发布时我把它搞砸了。但它仍然无法正常工作。只有当我删除我可以访问 user.jsp 的 form:input path="userName" 请尝试为特定页面添加 GET 处理程序并添加用户属性(而不是像welcome.do 这样的另一个页面,而不是像auser 这样具有不同属性名称的页面)。将您尝试执行的 GET 和 POST 一起使用。【参考方案2】:

在这种情况下,我必须强调两点:

    BindingResult 与直接的 @ModelAttribute 条目相关联 当您报告错误时,您会将其与模型属性相关联。此属性名称应出现在 @ModelAttribute 中,并且区分大小写。

示例:

@ModelAttribute("side") SideDetails s,BindingResult sideResult          
@ModelAttribute("track") TrackDetails t, BindingResult trackResult

在上面的例子中,sideResult 的目标是SideDetails。同样,trackResultTrackDetails 作为目标。

在使用sideResult 报告错误时,将在模型SideDetails 中搜索属性名称。未能找到该属性,我们收到此博客中报告的错误。

希望这会有所帮助。

【讨论】:

以上是关于SpringMVC 错误:Bean 名称“用户”的 BindingResult 和普通目标对象都不能用作请求属性的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC-处理程序映射(Handler Mapping)-Bean名称Url处理程序映射(Bean Name Url Handler Mapping)示例(转载实践)

使用Idea构建springmvc框架,出现no bean named 'cacheManager' is defined 错误

视图解析器的作用 -----bean

Thymeleaf + Spring:Bean 名称“用户”的 BindingResult 和普通目标对象都不能用作请求属性

No qualifying bean of type '***' available: expected at least 1 bean which qualifies as auto

springMVC--4种映射处理器handlerMapping