Spring 6+JSTL环境下JSP收集ClientMapping对象列表的报错解决
Spring 6 JSP表单绑定List对象时NotReadablePropertyException的解决办法
问题根源
你把List<ClientMapping>作为modelAttribute绑定到表单,但JSP里的path="${cm}.mappingName"写法完全错误——${cm}会输出ClientMapping对象的toString值,Spring会把这个字符串当成List的属性名去查找,而List根本没有这个属性,直接触发NotReadablePropertyException。
正确实现方式
Spring表单绑定集合类型时,必须通过索引下标定位集合内的元素,结合<c:forEach>的varStatus获取索引即可解决:
修改后的JSP代码
<div class="card-body justify-content-md-center" style="background-color: darkgray;"> <form:form action="${pageContext.request.contextPath}/mappingtool/gatherMappingDetails" method="POST" modelAttribute="clientMappingChoices"> <c:forEach items="${clientMappingChoices}" var="cm" varStatus="status"> <div class="table-responsive"> <table class="table table-responsive table-striped table-hover table-sm" id="viewTable"> <tbody> <tr> <td colspan="2" class="fw-bolder justify-content-md-center"> <h2 class="text-primary">${message}</h2> </td> </tr> <tr> <td class="fw-bolder"> <label for="mappingName" class="form-label"> Client Mapping Name:</label> <label class="text-danger"> Required</label> </td> <td class="fw-bolder"> <!-- 用varStatus的index指定集合元素下标 --> <form:input class="form-control form-control-sm" id="mappingName" path="[${status.index}].mappingName" cssStyle="width:200px;" /> <form:errors path="[${status.index}].mappingName" /> </td> </tr> <tr> <td> </td> <td> <input class="btn btn-danger my-2 my-sm-0" id="save" type="submit" value="Save" /> </td> </tr> </tbody> </table> </div> </c:forEach> </form:form>
后端接收代码参考
处理POST请求的控制器方法,要通过@ModelAttribute指定绑定的集合名称:
@RequestMapping(value = "/mappingtool/gatherMappingDetails", method = RequestMethod.POST) public String gatherMappingDetails(@ModelAttribute("clientMappingChoices") List<ClientMapping> clientMappings, Model model) { // 处理提交的映射数据 return "mappingtool/result-view"; }
关键注意点
- Spring表单的
path属性是基于modelAttribute对应的对象解析的,集合类型必须用[索引]格式定位元素 varStatus的index属性是从0开始的下标,刚好匹配List的索引规则- 确保
ClientMapping类的所有属性都有标准的getter/setter方法,否则会引发类似的属性访问异常
内容的提问来源于stack exchange,提问作者charles didonato
相关产品推荐
相关产品推荐

