2012-07-20 53 views
0

環境:用SpringMVC Maven的Netbeans的Glassfish的錯誤用SpringMVC:既不BindingResult也不對豆名 '用戶' 可作爲請求屬性純目標對象

SEVERE: Neither BindingResult nor plain target object for bean name 'user' available as request attribute java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'user' available as request attribute at org.springframework.web.servlet.support.BindStatus.(BindStatus.java:141) at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:178) at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:198) at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:164) at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.autogenerateId(AbstractDataBoundFormElementTag.java:151) at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.resolveId(AbstractDataBoundFormElementTag.java:142) at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.java:126) at org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:421) at org.springframework.web.servlet.tags.form.InputTag.writeTagContent(InputTag.java:142) at org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:102) at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:79) at org.apache.jsp.user_jsp._jspx_meth_form_input_0(user_jsp.java:178) at org.apache.jsp.user_jsp._jspx_meth_form_form_0(user_jsp.java:120) at org.apache.jsp.user_jsp._jspService(user_jsp.java:76) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111) at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:403) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378) at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) at com.sun.grizzly.ContextTask.run(ContextTask.java:71) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at 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/use」時,瀏覽器出現此錯誤r.jsp」 java.lang.IllegalStateException:既不BindingResult也不對豆名‘用戶’可作爲請求屬性純目標對象

如果刪除form:input path="userName")從JSP,在jsp顯示正確,當我點擊提交按鈕的控制檯輸出「用戶名:null」。

有這麼多帖子在stackoverflow關於這個相同的錯誤,但沒有解決方案爲我工作。

添加以下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://本地主機: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://本地主機:8080/NBGFMN/createuser.do」,瀏覽器的輸出 「安迪」

但表單POST仍然不起作用。

+0

你可以添加'GET'handler嗎?您是在那裏添加模型屬性還是通過'@ModelAttribute(「user」)'註釋的方法? – Wolfram 2012-07-20 13:43:06

+0

嗨,我添加了下面的GET方法和welcome.jsp,它完美的工作。至於@ModelAttribute(「用戶」),是的,我擁有它。我在網上谷歌這個錯誤信息,看到所有人都說,但它不適合我。我試過SpringMVC-3.0.7和最新的3.1.2,仍然沒有工作 – wlin 2012-07-20 13:50:33

回答

0

您是否嘗試在名稱爲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=postdefault method is GET,這不符合您的處理程序。

+0

我添加了下面的GET方法(創建一個用戶),它的工作 – wlin 2012-07-20 14:07:45

+0

不,只有GET的作品。問題是表單POST。 – wlin 2012-07-20 15:23:15

+0

嘗試在form:form元素中指定'method = post',默認方法是'GET',它與您的處理程序不匹配。 – Wolfram 2012-07-20 15:35:24

0

有我在這方面做出了重要的兩點:

  1. BindingResult與即時@ModelAttribute進入
  2. 當你報告錯誤,可以將其與一個模型屬性關聯的關聯。該屬性名稱應該出現在@ModelAttribute中,並區分大小寫。

樣品:

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

在上面的例子中,sideResult將有目標作爲SideDetails。同樣,trackResult將以TrackDetails爲目標。

在報告sideResult錯誤時,將在模型SideDetails中搜索屬性名稱。未能找到此屬性,我們會在此博客中報告錯誤。

希望這會有所幫助。

相關問題