spring使用路径非属性无效的表单绑定

时间:2015-12-28 18:47:51

标签: spring-mvc

我有一个表单,当我使用带有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的已编辑值。

1 个答案:

答案 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;
}
相关问题