Org.springframework.beans.NotReadablePropertyException: Invalid property of bean class bean property is not being read or has an invalid getter method

Spring MVC is new to me. I would like to have some comprehensive literature with an example on Spring MVC (even the white papers are not easy to understand).

So the problem I am facing:

Jun 15, 2013 2:42:36 PM org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet [appServlet] in context with path [/controller] threw exception [An exception occurred processing JSP page /WEB-INF/views/index.jsp at line 27 24: 25: <form:form commandName="creationDate" method="GET" action="add"> 26: 27: <form:label path="creationDate.ParticularDate">Particular Date</form:label> 28: <form:input path="creationDate.ParticularDate" /> 29: 30: <form:label path="creationDate.childGoSchoolDate">Child go to School</form:label> Stacktrace:] with root cause org.springframework.beans.NotReadablePropertyException: Invalid property 'creationDate' of bean class [edu.demidov.dom.CreationDate]: Bean property 'creationDate' 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.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:707) at org.springframework.beans.BeanWrapperImpl.getNestedBeanWrapper(BeanWrapperImpl.java:554) at org.springframework.beans.BeanWrapperImpl.getBeanWrapperForPropertyPath(BeanWrapperImpl.java:531) at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:697) at org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(AbstractPropertyBindingResult.java:99) at org.springframework.validation.AbstractBindingResult.getFieldValue(AbstractBindingResult.java:218) at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:120) at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:179) at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:199) at org.springframework.web.servlet.tags.form.LabelTag.autogenerateFor(LabelTag.java:130) at org.springframework.web.servlet.tags.form.LabelTag.resolveFor(LabelTag.java:120) at org.springframework.web.servlet.tags.form.LabelTag.writeTagContent(LabelTag.java:90) at org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:103) at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:80) at org.apache.jsp.WEB_002dINF.views.index_jsp._jspx_meth_form_005flabel_005f0(index_jsp.java:184) at org.apache.jsp.WEB_002dINF.views.index_jsp._jspx_meth_form_005fform_005f0(index_jsp.java:128) at org.apache.jsp.WEB_002dINF.views.index_jsp._jspService(index_jsp.java:88) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:471) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:402) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329) at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238) at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:264) at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1208) at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:992) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:939) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827) at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:722) 

Why is this happening? I don’t understand why it says that I do not have the correct setter and getter method for my Entity, and I don’t think I need to define them in the controller class. I'm right?

My controller:

 @Autowired private ControllerSupportClass controllerSupportClass; public void setControllerSupportClass( ControllerSupportClass controllerSupportClass) { this.controllerSupportClass = controllerSupportClass; } @RequestMapping(value ="/index", method=RequestMethod.GET) public ModelAndView firstPage(Model model) { CreationDate creationDate = new CreationDate(); model.addAttribute("creationDate", creationDate); return new ModelAndView("index"); } @RequestMapping(value ="/result", method=RequestMethod.GET) public String SecondActionPage(@RequestParam String particularDate, @RequestParam String nameOfInstitution, @RequestParam String typeName, Model model) throws Exception { if(particularDate !="" && nameOfInstitution !="" && typeName=="") { controllerSupportClass.findWithDateAndName(nameOfInstitution, particularDate, model); } else if(particularDate !="" && nameOfInstitution =="" && typeName !="") { controllerSupportClass.findWithAddedDateAndType(typeName, particularDate, model); } else if(particularDate !="" && nameOfInstitution =="" && typeName==""){ controllerSupportClass.findWithAddedDate(particularDate, model); } else if(particularDate !="" && nameOfInstitution !="" && typeName !="") { throw new Exception("Search by choose all parameters is not exceptable"); } else { throw new Exception("You didn't put any search parameters"); } return "result"; } @RequestMapping(value="/add", method=RequestMethod.GET) public String addingData(@ModelAttribute("creationDate") CreationDate creationDate, BindingResult result, Model model) { controllerSupportClass.saveDataToDataBase(creationDate); return "add"; } } 

And my jsp:

 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="utf-8"%> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <!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=utf-8"> <title>Sorting page</title> </head> <body> <h3>Insert data:</h3> <form:form commandName="CreationDate" method="GET" action="add"> <form:label path="creationDate.particularDate">Particular Date</form:label> <form:input path="creationDate.particularDate" /> <form:label path="creationDate.childGoSchoolDate">Child go to School</form:label> <form:input path="creationDate.childGoSchoolDate"/> <form:label path="creationDate.childAdmissionDate">Child admission Date</form:label> <form:input path="creationDate.childAdmissionDate"/> <input type="submit" value="Save"/> </form:form> </body> </html> 

Yes, my creation of CreationDate:

 @Entity @Table(name="CREATION_DATE") @NamedQueries ({ @NamedQuery(name="creationDate.findById", query="select distinct c from CreationDate c left join fetch c.institution n " + "left join fetch c.scheduleRotationChild s where c.dateId= :i") }) public class CreationDate implements Serializable { private static final long serialVersionUID = 1648102358397071136L; private int dateId; @Id @GeneratedValue(strategy=IDENTITY) @Column(name="DATE_ID") public int getDateId() { return dateId; } public void setDateId(int dateId) { this.dateId = dateId; } private Date particularDate; @Column(name="PARTICULAR_DATE") public Date getParticularDate() { return particularDate; } public void setParticularDate(Date particularDate) { this.particularDate = particularDate; } private int version; @Version @Column(name="VERSION") public int getVersion() { return version; } public void setVersion(int version) { this.version = version; } private Date childGoSchoolDate; @Temporal(TemporalType.DATE) @Column(name="CHILD_GO_SCHOOL_DATE") public Date getChildGoSchoolDate() { return childGoSchoolDate; } public void setChildGoSchoolDate(Date childGoSchoolDate) { this.childGoSchoolDate = childGoSchoolDate; } private Date childAdmissionDate; @Temporal(TemporalType.DATE) @Column(name="CHILD_ADMISSION_DATE") public Date getChildAdmissionDate() { return childAdmissionDate; } public void setChildAdmissionDate(Date childAdmissionDate) { this.childAdmissionDate = childAdmissionDate; } private Set<Institution> institution = new HashSet<Institution>(); @ManyToMany(fetch = FetchType.LAZY) @Cascade(org.hibernate.annotations.CascadeType.ALL) @JoinTable(name="CREATIONDATE_INSTITUTION", joinColumns=@JoinColumn (name="DATE_ID"), inverseJoinColumns=@JoinColumn (name="INSTITUTION_ID")) public Set<Institution> getInstitution() { return institution; } public void setInstitution(Set<Institution> institutionSet) { this.institution = institutionSet; } private List<ScheduleRotationChild> scheduleRotationChild = new ArrayList<ScheduleRotationChild>(); @OneToMany(fetch=FetchType.EAGER, orphanRemoval=true) @Cascade(org.hibernate.annotations.CascadeType.ALL) @JoinTable(name="SRC_DATE", joinColumns=@JoinColumn (name="DATE_ID"), inverseJoinColumns=@JoinColumn (name="SRC_ID")) public List<ScheduleRotationChild> getScheduleRotationChild() { return scheduleRotationChild; } public void setScheduleRotationChild( List<ScheduleRotationChild> scheduleRotationChild) { this.scheduleRotationChild = scheduleRotationChild; } public void addSetInstitutions(Set<Institution> institution) { setInstitution(institution); } public void addSRC(List<ScheduleRotationChild> srcinstitution) { setScheduleRotationChild(srcinstitution); } public String toString() { return "\n" + "ID: " + dateId + " \n " + ": " +particularDate + " \n " + "   , : " + childGoSchoolDate + " \n " + "  : " + childAdmissionDate + " " + scheduleRotationChild + " \n " ; } } 

Hope this clarifies my problem for you guys. Thanks.

+4
source share
3 answers

The path values ​​in the form:label and form:input must refer to the command object specified in form:form . In other words, path values ​​must be property names of the creationDate object class. Basqually, simply remove the creationDate. prefix creationDate. so you are done with this:

 <form:form commandName="creationDate" method="GET" action="add"> <form:label path="particularDate">Particular Date</form:label> <form:input path="particularDate" /> <form:label path="childGoSchoolDate">Child go to School</form:label> 

Assuming the creationDate class has properties (with getters / setters) called particularDate and childGoSchoolDate .

+6
source

The path attribute creationDate.ParticularDate should probably be creationDate.ParticularDate .

Make sure your CreationDate has the correct getter method for the #getParticularDate() property.

+1
source

I had the same problem, but the problem is that I did not create getters and setters, I wrote them manually. All my ways and methods were correct. So I deleted the getter and setter method that I wrote manually and generated them using eclipse. I do not understand the logic, but this solves my problem.

0
source

Source: https://habr.com/ru/post/1486394/


All Articles