【问题标题】:Bean property 'id' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?Bean 属性 'id' 不可读或有无效的 getter 方法:getter 的返回类型是否与 setter 的参数类型匹配?
【发布时间】:2019-06-12 11:49:29
【问题描述】:

全栈跟踪

  Jun 12, 2019 5:13:04 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [spring] in context with path [/quaris] threw exception [An exception occurred processing [/WEB-INF/jsp/studentEdit.jsp] at line [11]

8:          <table >  
9:          <tr>
10:         <td></td>  
11:          <td><form:hidden  path="id" /></td>
12:          </tr> 
13:          <tr>  
14:           <td>userName : </td> 


Stacktrace:] with root cause
org.springframework.beans.NotReadablePropertyException: Invalid property 'id' of bean class [java.util.ArrayList]: Bean property 'id' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
    at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:622)
    at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:612)
    at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:158)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:177)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:198)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:163)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.autogenerateId(AbstractDataBoundFormElementTag.java:148)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.resolveId(AbstractDataBoundFormElementTag.java:138)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.java:121)
    at org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:459)
    at org.springframework.web.servlet.tags.form.HiddenInputTag.writeTagContent(HiddenInputTag.java:112)
    at org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:86)
    at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:83)
    at org.apache.jsp.WEB_002dINF.jsp.studentEdit_jsp._jspx_meth_form_005fhidden_005f0(studentEdit_jsp.java:247)
    at org.apache.jsp.WEB_002dINF.jsp.studentEdit_jsp._jspx_meth_form_005fform_005f0(studentEdit_jsp.java:186)
    at org.apache.jsp.WEB_002dINF.jsp.studentEdit_jsp._jspService(studentEdit_jsp.java:140)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:459)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:384)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
    at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:170)
    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:316)
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1370)
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1116)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1055)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:200)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1839)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

这是实体类:

package com.sample.Entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name="Student")
public class Student {

    @Id
    @GenericGenerator(name="inc",strategy="increment")
    @GeneratedValue(generator="inc")
    @Column(name="id")
    private int id;

    @Column(name="username")
    private String username;

    @Column(name="password")
    private int password;


    public Student() {
        // TODO Auto-generated constructor stub
    }


    public Student(int id, String username) {
        super();
        this.id = id;
        this.username = username;
    }


    public Student(int id, String username, int password) {
        super();
        this.id = id;
        this.username = username;
        this.password = password;
    }


    public int getId() {
        return id;
    }


    public void setId(int id) {
        this.id = id;
    }


    public String getUsername() {
        return username;
    }


    public void setUsername(String username) {
        this.username = username;
    }


    public int getPassword() {
        return password;
    }


    public void setPassword(int password) {
        this.password = password;
    }


}

这是控制器:

@RequestMapping(value="/editstd/{id}")  
    public String edit(@PathVariable int id, Model m){  
        List<Student> std= studentService.editStudent(id); 
        m.addAttribute("command",std);
        return "studentEdit";  
    } 

 @RequestMapping(value="/editsave",method = RequestMethod.POST)  
    public String editsave(@ModelAttribute("student") Student student){  
        studentService.updateStudent(student); 
        return "redirect:/userDetails";  
    } 

这是要编辑的jsp页面:

 <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>  
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>  

        <h1>Edit Student</h1>
       <form:form method="POST" action="/quaris/editsave">  
        <table >  
        <tr>
        <td></td>  
         <td><form:hidden  path="id" /></td>
         </tr> 
         <tr>  
          <td>userName : </td> 
          <td><form:input path="username"  /></td>
         </tr>  
         <tr>  
          <td>Password :</td>  
          <td><form:input path="password" /></td>
         </tr> 
         <tr>  
          <td> </td>  
          <td><input type="submit" value="Edit Save" /></td>  
         </tr>  
        </table>  
       </form:form>  

我正在尝试编辑 jsp 页面,但无法编辑。它显示了 getter 和 setter 方法的错误。欢迎任何建议。提前谢谢你!

【问题讨论】:

  • 添加完整的堆栈跟踪
  • 我添加了完整的堆栈跟踪
  • 你的问题解决了吗?

标签: hibernate spring-mvc jsp


【解决方案1】:

问题来自id 字段。您在代码中做出了相互矛盾的选择。在你的实体上,你有这个:

@Id
@GenericGenerator(name="inc",strategy="increment")
@GeneratedValue(generator="inc")
@Column(name="id")
private int id;

这意味着您将id 属性的增量委托给您的生成器。那你为什么有:

<td><form:hidden  path="id" /></td>

在你的形式?永远不要手动设置id(测试除外)。

您还在某处定义了 java.util.ArrayList 类型的 bean:

Invalid property 'id' of bean class [java.util.ArrayList]

我猜是ArrayList&lt;Student&gt;,您尝试读取该bean 的属性id,但您不能,因为idStudent 的属性而不是ArrayList。在处理它之前,您必须从 ArrayList 中检索 Student

【讨论】:

  • 即使我删除了 id,它现在也显示 bean 类 [java.util.ArrayList] 的无效属性“用户名”
  • 这个错误什么时候发生?还有为什么你有List&lt;Student&gt; std= studentService.editStudent(id);?有同一个id的同学吗?
  • 当我点击编辑按钮时,它显示这个错误....并且 id 是自动生成的,所以没有学生有相同的 id
  • 如果只有一名学生具有相同的id,则应仅返回studentService.editStudent(id); 中的一名学生而不是列表。
  • 好的,我就这样试试
猜你喜欢
  • 2014-10-17
  • 2019-12-20
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多