我有一个隐藏的字段" tmpFileId"以我不想绑定到模型的形式。我想使用http servlet请求的getParameter请求来获取它。所以我在我的控制器中做到了这一点:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setIgnoreUnknownFields(false);
}
但我是否将true
或false
设置为setIgnoreUnknownFields
的参数我收到了错误
"Invalid property 'tmpFileId' of bean class [tms.TrainingInstructor]: Bean property 'tmpFileId' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?"
来自文档:
public void setIgnoreUnknownFields(boolean ignoreUnknownFields)
Set whether to ignore unknown fields, that is, whether to ignore bind parameters that do not have corresponding fields in the target object.
Default is "true". Turn this off to enforce that all bind parameters must have a matching field in the target object.
Note that this setting only applies to binding operations on this DataBinder, not to retrieving values via its BindingResult.
See Also:
bind(org.springframework.beans.PropertyValues)
所以现在我不确定我是否做得很好。从文本"注意,此设置仅适用于此DataBinder上的绑定操作,而不是通过其BindingResult"检索值,是否意味着它仅适用于get(即从模型渲染jsp) )而不是发布(即从jsp到模型)?
由于
PS:我的jsp
<form:form method="post" action="addEditTrainingInstructor" commandName="trainingInstructor">
<form:hidden path="id" />
<form:hidden path="tmpFileId" />
</form:form>
我的控制器
@RequestMapping(value="/addEditTrainingInstructor", params="create", method=RequestMethod.POST)
public String addEditTrainingInstructor(@ModelAttribute("trainingInstructor")TrainingInstructor instructor, BindingResult result, HttpSession session, HttpServletRequest request) {
Integer classID = (Integer) session.getAttribute("TrainingClassID");
TrainingClass trainingClass = new TrainingClass();
trainingClass.setId(classID);
String tmpFileId = request.getParameter("tmpFileId");
logger.debug("class ID for instructor: "+classID);
instructor.setTrainingClass(trainingClass);
tmsService.saveTrainingInstructor(instructor);
return "redirect:/index";
}
我的模特
@Entity
@Table(name="TrainingInstructor")
public class TrainingInstructor {
@Id
@Column(name="id")
private Integer id;
@OneToOne(fetch = FetchType.EAGER, cascade={CascadeType.MERGE,CascadeType.PERSIST})
@JoinColumn(name="TrainingClassID", referencedColumnName="id")
private TrainingClass trainingClass;
@OneToOne(fetch = FetchType.LAZY, cascade={CascadeType.MERGE,CascadeType.PERSIST})
@JoinColumn(name="StuffID", referencedColumnName="id")
private Stuff instructor;
@Column(name="certificatecopy")
private byte[] certificate;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Stuff getInstructor() {
return instructor;
}
public void setInstructor(Stuff instructor) {
this.instructor = instructor;
}
public byte[] getCertificate() {
return certificate;
}
public void setCertificate(byte[] certificate) {
this.certificate = certificate;
}
public TrainingClass getTrainingClass() {
return trainingClass;
}
public void setTrainingClass(TrainingClass trainingClass) {
this.trainingClass = trainingClass;
}
}
这是stacktrace:
org.apache.jasper.JasperException: org.springframework.beans.NotReadablePropertyException: Invalid property 'tmpFileId' of bean class [tms.TrainingInstructor]: Bean property 'tmpFileId' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:549)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:209)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:266)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1225)
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1012)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:931)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:822)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:807)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause
org.springframework.beans.NotReadablePropertyException: Invalid property 'tmpFileId' of bean class [tms.TrainingInstructor]: Bean property 'tmpFileId' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:723)
org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:714)
org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(AbstractPropertyBindingResult.java:99)
org.springframework.validation.AbstractBindingResult.getFieldValue(AbstractBindingResult.java:229)
org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:120)
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.autogenerateId(AbstractDataBoundFormElementTag.java:141)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.resolveId(AbstractDataBoundFormElementTag.java:132)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.java:116)
org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:422)
org.springframework.web.servlet.tags.form.HiddenInputTag.writeTagContent(HiddenInputTag.java:79)
org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:84)
org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:80)
org.apache.jsp.WEB_002dINF.jsp.trainingInstructorForm_jsp._jspx_meth_form_005fhidden_005f1(trainingInstructorForm_jsp.java:223)
org.apache.jsp.WEB_002dINF.jsp.trainingInstructorForm_jsp._jspx_meth_form_005fform_005f0(trainingInstructorForm_jsp.java:141)
org.apache.jsp.WEB_002dINF.jsp.trainingInstructorForm_jsp._jspService(trainingInstructorForm_jsp.java:98)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:209)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:266)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1225)
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1012)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:931)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:822)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:807)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)