You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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">&nbsp;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>&nbsp;</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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 05:43:16