我有一个表单,当我使用带有path属性的spring form标签时,我收到以下错误 java.lang.IllegalStateException:BindingResult和bean名称'selectedPerson'的普通目标对象都不可用作请求属性
但是当我使用带有name属性的常规HTML输入时,我没有看到任何问题。
我做错了什么。
这是控制器代码
@RequestMapping(value="/savePersonChanges.htm",method=RequestMethod.POST)
public ModelAndView savePersonChanges(HttpSession session,@Valid @ModelAttribute(value="selectedPerson")PersonBean editedPersonBean,BindingResult bindingResult){
ModelAndView mav=new ModelAndView();
mav.setViewName(LANDING_PAGE;
mav.addObject(TAB_SELECTOR,"EditPerson");
if(session!=null){
Rpt_date=(java.util.Date)session.getAttribute("editDate");
}
if(bindingResult.hasErrors()){
mav.addObject("errorDescription",errorDescription );
}
else{
/* Call service that updates database with table changes */
try{
PersonService.updatePerson(Rpt_date, editedPersonBean
}
catch(Exception e){
log.logError("Exception while updating Person", e.toString());
}
}
return mav;
}
表格如下:
<form:form modelAttribute="selectedPerson" id="editPersonForm">
<table id="selectPerson">
<tbody>
<tr>
<td>
<select id="personId" name="personId" onchange="getPersonDetails(this)">
<c:choose>
<c:when test="${empty selectedPerson}">
<option value="0" selected ="selected">Select A Person</option>
<c:forEach var="personIdItem" items="${editPersonProperties.personproperties}">
<option value="${personIdItem.personId}"><spring:escapeBody>${personIdItem.personName}</spring:escapeBody></option>
</c:forEach>
</c:when>
<c:otherwise>
<c:forEach var="personIdItem" items="${editPersonProperties.personproperties}">
<c:if test="${personIdItem.personId eq selectedPerson.personId}">
<option value="${personIdItem.personId}" selected ="selected">${personIdItem.personName}</option>
</c:if>
<c:if test="${personIdItem.personId ne selectedPerson}">
<option value="${personIdItem.personId}"><spring:escapeBody>${personIdItem.personName}</spring:escapeBody></option>
</c:if>
</c:forEach>
</c:otherwise>
</c:choose>
</select>
</td>
</tr>
</tbody>
</table>
<!-- Person Details -->
<table id="editPersonTable">
<tr>
<td>First Name</td>
<td> <form:input type ="text" path="fname" value="${selectedPerson.fname}"></form:input></td>
<td>Last Name</td>
<td> <form:input type ="text" path="lname" value="${selectedPerson.lname}"/></td>
</tr>
</table>
<div class="editcancelstyle">
<input id="savebtn" type="button" onclick="savePerson()" value="Save" />
<input id="cancelbtn" type="button" onclick="cancelPersonEdits ()"value="Cancel" />
</div>
</form:form>
我知道path属性会将字段绑定到表单。但是,我一直收到绑定错误。如果我使用纯HTML替换,控制器将看到SelectedPerson bean的fname和lname的已编辑值。
答案 0 :(得分:1)
当你这样做时,这是你的问题:
<form:... modelAttribute="selectedPerson" ...>
, selectedPerson
是从模型和版本的持有者映射的模型对象的关键。查看类(例如:ModelAndView
),假设您将控制器中的模型与new ModelAndView ("yourForm", "selectedPerson", new Person())
绑定,
@RequestMapping(value = "/form")
public ModelAndView userInput() {
ModelAndView mv = new ModelAndView("personForm", "selectedPerson", new Person());
return mv;
}
现在Person
已与 selectedPerson
映射,因此当此表单作为来自控制器的响应返回时,您的表单已被绑定到Person
模型,以便您使用path
来引用此人的属性(例如path="name"
,表示它引用人&# 39; s name
属性)
在您的表单中modelAttribute="selectedPerson"
,selectedPerson
未绑定到任何模型,因为&#34; selectedPerson &#34 ;是从不分配给任何对象,因为在处理(提交)表单之前您没有先进行任何绑定。
这就是你得到的原因
> java.lang.IllegalStateException: Neither BindingResult nor plain
> target object for bean name 'selectedPerson' available as request
> attribute.
请注意,要使此绑定有效,请在表单顶部添加以下内容
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
然后你可以填充表单的字段(假设你把action =&#34; result.html&#34;):
@RequestMapping(value = "/result")
public ModelAndView processUser( @ModelAttribute("selectedPerson") Person person, BindingResult result) {
if (result.hasErrors()) {
return new ModelAndView("errorPage","message","Something goes wrong");
}
/*System.out.println(person.getName());*/
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("personResult");
modelAndView.addObject("person", person);
return modelAndView;
}