【问题标题】:spring Form binding using path not attribute not working使用路径不属性的弹簧表单绑定不起作用
【发布时间】:2015-12-28 18:47:50
【问题描述】:

我有一个表单,当我使用带有路径属性的弹簧表单标签时,我收到以下错误 java.lang.IllegalStateException:Bean 名称“selectedPerson”的 BindingResult 和普通目标对象都不能用作请求属性

但是,当我使用带有 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 的编辑值。

【问题讨论】:

  • 请看一下这个answer
  • 感谢您的提示。我应该在哪里添加 model.addAttribute?应该是显示表单的控制器调用吗?
  • 对不起-我很困惑我希望保存方法在其中包含表单编辑值。我是否应该将模型的属性添加到填充表单的先前请求映射?我尝试添加到模型中,但仍然遇到同样的错误。

标签: spring-mvc


【解决方案1】:

这是你的问题,当你这样做时:

&lt;form:... modelAttribute="selectedPerson" ...&gt;selectedPerson 是从模型和视图类的持有者映射的模型对象的键(例如:ModelAndView),假设您在控制器中绑定模型与new ModelAndView ("yourForm", "selectedPerson", new Person()),

 @RequestMapping(value = "/form")
    public ModelAndView userInput() {
        ModelAndView mv = new ModelAndView("personForm", "selectedPerson", new Person()); 
            return mv;
    }

现在PersonselectedPerson 映射,所以当这个 form 作为控制器的响应返回时,您的表单已经绑定到 Person模型,以便您使用 path 来引用此 Person 的属性(例如 path="name" ,表示它引用 Personname 属性)

在您的表单中,modelAttribute="selectedPerson"selectedPerson未绑定到任何模型,因为“selectedPerson从不分配给任何对象,因为您在处理(提交)表单之前没有先进行任何绑定。

这就是你得到的原因

> 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="result.html"):

 @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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多