Spring MVC对我来说是新手。我想有一些关于Spring MVC的综合文献(甚至官方文档也不容易理解)。
所以我面临的问题是:
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)
为什么会这样?我不明白为什么我说我的实体没有适当的setter和getter方法,我认为我不必在我的控制器类中定义它们。我是对的吗?
我的控制器:
@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";
}
}
我的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>
是的,我的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 " ;
}
}
我希望这能让你澄清我的问题。谢谢。
答案 0 :(得分:6)
path
和form:label
标记中的form:input
值应与form:form
中引用的命令对象相关。换句话说,path
值应该是creationDate
对象的类的属性名称。最重要的是只删除creationDate.
前缀,以便最终得到:
<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>
假设creationDate
类具有名为particularDate
和childGoSchoolDate
的属性(带有getter / setter)。
答案 1 :(得分:1)
path
属性creationDate.ParticularDate
应该是creationDate.particularDate
。
确保您的CreationDate
对象具有适当的属性getter方法#getParticularDate()
。
答案 2 :(得分:0)
我有同样的问题,但问题是我没有生成getter和setter,我手动写下来。我的所有路径和方法都是正确的。所以我删除了手工编写的getter和setter方法,并使用eclipse生成它们。我不明白它背后的逻辑,但这解决了我的问题。
答案 3 :(得分:0)
Command
类与form标记中提到的path变量丢失。
答案 4 :(得分:0)
对于bean,重要的是为吸气器提供适当的名称。假设,如果某个类将您的类视为Bean,并且想要访问属性boxType,则必须提供不带参数的getter getBoxType()。有一个关于吸气剂名称的合同。 “获取” +大写字母(B)+其余的财产名称。您可能有一个公共属性boxType,但是就bean而言,它的用处不大。您需要从getter中的该字段返回值。 自动生成的吸气剂通常可以,但是对于布尔值,某些IDE会添加“ is”而不是“ get”。