【问题标题】:Spring MVC Neither BindingResult nor plain targetSpring MVC 既不是 BindingResult 也不是普通目标
【发布时间】:2014-04-05 01:16:19
【问题描述】:

java.lang.IllegalStateException:Bean 名称“用户”的 BindingResult 和普通目标对象都不能用作请求属性 因此,当我尝试运行此网页时出现此错误,我不知道为什么。 我看到并阅读了很多关于此错误的信息,但我无法找出问题所在。

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web- app_2_5.xsd" id="WebApp_ID" version="2.5">

 <display-name>onallo_labor</display-name>
  <welcome-file-list>
<welcome-file>welcome.jsp</welcome-file>
  </welcome-file-list>

   <servlet>
    <servlet-name>servlet_1</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>servlet_1</servlet-name>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>

    <context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/servlet_1-servlet.xml</param-value>
  </context-param>

      <listener>
       <listener-class>
          org.springframework.web.context.ContextLoaderListener
       </listener-class>
  </listener> 

</web-app>

servlet_1-servlet.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="org.springframework.samples.petclinic.web"/>

</beans>

创建控制器:

打包onallo_labor;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.portlet.ModelAndView;

@Controller
public class CreateController {
    @RequestMapping(value="create",method=RequestMethod.GET)
    public ModelAndView create(){
        return new ModelAndView("create","user",new User());
}
@RequestMapping(value="",method=RequestMethod.GET)
public ModelAndView welcome(){
    return new ModelAndView("welcome");
}
@RequestMapping(value="create_ready",method=RequestMethod.POST)
public String addContact(@ModelAttribute("user")
        User user,Model model) {

    model.addAttribute("username",user.getUsername());
    model.addAttribute("birthday",user.getBirthday());

    return "create_ready";
}
}

create.jsp:

<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>User Account Creation</title>
</head>
<body>

<div align="center">
<form:form method="POST" modelAttribute="user">
    <table border="0">
        <tr>
            <td colspan="2" align="center"><h2>Registration Form</h2></td>
        </tr>
        <tr>
            <td>Username: </td>
            <td><form:input path="username" id="djb"/></td>
        </tr>
        <tr>
            <td>Password: </td>
            <td><form:password path="password"/></td>
        </tr>
        <tr>
            <td>Birthday: </td>
            <td><form:input path="birthday"/></td>
        </tr>
        <tr>
                <td colspan="2" align="center"><input type="submit" value="Submit" /></td>
        </tr>
    </table>
</form:form>
</div>




</body>
</html>

create_ready.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <h2>Submitted User Information</h2>
   <table>
<tr>
    <td>Name</td>
    <td>${username}</td>
</tr>
<tr>
    <td>Birthday</td>
    <td>${birthday}</td>
</tr>
</table> 
</body>
</html>

用户类:

package onallo_labor;

public class User {
public User(){}
public String   username;
public String   password;
public String   birthday;
public String getUsername(){return this.username;}
public void setUsername(String un){this.username=un;}
public String getPassword(){return this.password;}
public void setPassword(String pw){this.password=pw;}
public String getBirthday(){return this.birthday;}
public void setBirthday(String bd){this.birthday=bd;}
}

有一张关于文件结构的图片。

http://kepkezelo.com/images/lm418k9xegg2aukio3.png

更新1: 所以我更改了 User 类中的方法名称,现在这里是错误:

org.apache.jasper.JasperException: An exception occurred processing JSP page /create.jsp at line 20

17:             </tr>
18:             <tr>
19:                 <td>Username: </td>
20:                 <td><form:input path="username" id="djb"/></td>
21:             </tr>
22:             <tr>
23:                 <td>Password: </td>


Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:413)
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)


root cause 

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'user' available as request attribute
org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:144)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:168)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:188)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:154)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.java:117)
org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:422)
org.springframework.web.servlet.tags.form.InputTag.writeTagContent(InputTag.java:142)
org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:84)
org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:80)
org.apache.jsp.create_jsp._jspx_meth_form_005finput_005f0(create_jsp.java:181)
org.apache.jsp.create_jsp._jspx_meth_form_005fform_005f0(create_jsp.java:125)
org.apache.jsp.create_jsp._jspService(create_jsp.java:78)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
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)

感谢您的回答。

【问题讨论】:

  • 不要使用 modelAttribute 尝试在你的 jsp 中使用 commandName
  • 我试过了,但后来我得到了这个错误:处理 JSP 页面时发生异常,再次出现异常:Bean 名称“用户”的 BindingResult 和普通目标对象都不能用作请求属性
  • 澄清一下,当您尝试在 /create 上执行 GET 操作时会出现异常?
  • 是的,当我尝试加载创建页面时
  • 请发布您的用户类别

标签: java spring jsp spring-mvc model-view-controller


【解决方案1】:

问题是多种事物的结合。你有

import org.springframework.web.portlet.ModelAndView;

@RequestMapping(value="create",method=RequestMethod.GET)
public ModelAndView create(){
    return new ModelAndView("create","user",new User());
}

portlet 库中的ModelAndView 不是default recognized return type for the DispatcherServlet stack.,因此,它将被视为普通Object 并添加到模型本身。因为您的 URI 是 .../create,所以 Spring 将使用最后一个路径元素映射到视图。因此,它最终会将您的create.jsp 解析为视图但出于错误的原因。

将您的 ModelAndView 更改为

import org.springframework.web.servlet.ModelAndView;

我不知道为什么你有一个portlet依赖,但是如果你不需要它就去掉它。

你也错过了

<mvc:annotation-driven />

来自您的 servlet 上下文。

你的 &lt;servlet&gt; 被映射到

<servlet-mapping>
    <servlet-name>servlet_1</servlet-name>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>

所以我不清楚您将请求发送到哪个 URL,../create.html

【讨论】:

  • 我改变了它,但什么也没改变,仍然是“Bean name 'user' 的 BindingResult 和普通目标对象都不能用作请求属性”错误或“处理 JSP 页面 /create.jsp 时发生异常”
  • @user3376275 将&lt;mvc:annotation-driven/&gt; 添加到您的servlet 上下文中。您还需要添加相应的 mvc 命名空间声明。
  • @user3376275 您甚至使用什么 URL 来访问您的应用程序? create.jsp 在您的 Web 项目中位于何处?
  • kepkezelo.com/images/lm418k9xegg2aukio3.png 这个网址:localhost/onallo_labor 加载了welcome.jsp 并且可以正常工作,并且有一个指向create.jsp 的链接创建用户帐户 a>,其网址为:localhost/onallo_labor/create.jsp
  • @user 对。您的DispatcherServlet 完全不参与转发到您的JSP。您的配置中缺少很多东西。首先,我之前提到的元素。然后你应该添加你自己的InternalResourceViewResolver。然后,您应该将您的 JSP 移动到 /WEB-INF 下的某个文件夹中,从外部看不到它们。
【解决方案2】:

您的 User 类是错误的,因为它是一个必须遵循某些命名约定的 java bean。例如,您的 setter 和 getter 名称错误,

'N' needs to be small
public String getUserName(){return this.username;}
Change to:
public String getUsername(){return this.username;}

【讨论】:

  • modelAttributecommandName 是等价的,并且在底层 FormTag 中使用相同的属性。
  • 可能是,但命名约定如何。这也错了吗?
  • 好的,我按照你说的做了,我更改了 User 类中的所有名称,并尝试了 whit modelattribute 和 commandname 现在我得到了这个:org.apache.jasper.JasperException:处理 JSP 时发生异常页面 /create.jsp 在第 20 行 17: 18: 19: 用户名: 20: 21: 22: 23: 密码:
  • 我查了 modelAttribute 和 commandName,你是对的。但是如果没有正确的命名约定,Spring 将无法将对象属性绑定到数据
猜你喜欢
相关资源
最近更新 更多
热门标签