Thymeleaf th:field访问嵌套Map抛出NotReadablePropertyException
问题根因
两个属性的表达式解析逻辑完全不一样:
th:text、th:utext这类普通属性里的表达式是直接运行SpEL/OGNL脚本,你写的.get(1)会被识别为调用Map的get方法,当然能正常拿到值。th:field是Spring表单绑定专用属性,路径解析走的是Spring原生BeanWrapper的属性访问规则,不支持显式.get()方法调用语法。你写votes.get(1)时,它会把整串votes.get(1)当成一个独立属性名去找对应的getter/setter,自然会抛出属性不可读的异常。- 不存在
th:field不支持Map类型的限制,不管是List还是Map,Spring属性绑定只认方括号[]的下标访问语法,你之前把votes改成List用[index]访问能正常运行,就是因为写法符合绑定规则。
修复方案
不需要调整现有嵌套Map的业务数据结构,只要把th:field路径里所有的.get(xxx)全部替换为[xxx]的方括号访问形式即可,多层嵌套Map直接叠加多层方括号,和List下标的写法完全一致。
修改后原报错位置的代码如下:
<input type="radio" th:field="*{votes[__${item.getBlock()}__][__${item.getSubblock()}__][__${itemIndex.index}__].voteValues}" th:value="${answer.id}" />
额外注意
你当前给单选radio绑定的是List<Integer>类型的voteValues,单选框本身是单值绑定逻辑,后续如果出现值回显异常、提交值类型不匹配的问题,把Vote实体里的voteValues改为单个Integer类型的属性即可,这个是表单控件和数据类型匹配的问题,和本次路径访问报错无关。
内容的提问来源于stack exchange,提问作者Jonny
相关产品推荐
相关产品推荐

