Spring MVC表单select标签报错:String类型不适用于选项items
Spring MVC表单select标签报错:String类型不适用于选项items
我来帮你分析下这个问题,你遇到的Type [java.lang.String] is not valid for option items报错,本质是Spring MVC的form:select标签的items属性收到了字符串类型的值,但它要求的是集合/数组这类可迭代的数据,问题主要出在这两个地方:
1. EL表达式语法错误 + Model中无对应属性
你JSP里写的items="{$districtsList}"有两个明显问题:
- EL表达式的正确写法是
${变量名},你写成了{$},这会让Spring把这个字符串直接当作items的数据源,自然就触发了“String类型无效”的错误; - 你的控制器里并没有把名为
districtsList的属性添加到Model中,你是把地区集合存到了register对象的districts属性里。
2. path属性使用不符合select标签的要求
你当前的path="districts"指向的是register里的集合属性,但form:select的path应该对应单个实体对象(用来存储用户选中的那一个选项),而集合数据应该放在items属性里。
修正方案
第一步:调整控制器(二选一即可)
- 选项一:把地区集合单独添加到Model中
在控制器的showWelcomePage方法里,获取到districts后,加上一行:model.addAttribute("districtsList", districts); - 选项二:直接复用
register对象里的集合
不需要额外修改控制器,后续JSP里直接通过register对象访问即可。
第二步:修改JSP代码
首先修正EL表达式,然后调整path属性(假设你的Register类新增了一个属性private EntityModelDistrict selectedDistrict;用来保存选中的地区):
<form:form method="post" action="/register" modelAttribute="register"> <div class="row"> <div class="col-lg-12 no-pdd"> <div class="sn-field"> <!-- 这里的itemValue和itemLabel要替换成你EntityModelDistrict类里的实际属性名 --> <!-- 如果用选项一的Model属性: --> <form:select path="selectedDistrict" items="${districtsList}" itemValue="id" itemLabel="districtName" multiple="false"/> <!-- 如果用选项二的register对象属性: --> <!-- <form:select path="selectedDistrict" items="${register.districts}" itemValue="id" itemLabel="districtName" multiple="false"/> --> <i class="la la-dropbox"></i> <span><i class="fa fa-ellipsis-h"></i></span> </div> </div> </div> </form:form>
注意:itemValue是选项的value值对应的实体属性,itemLabel是页面上显示的选项文本对应的实体属性,要根据你EntityModelDistrict类的实际字段名修改。
这样调整后,Spring就能正确识别items的集合数据源,同时path也能正确绑定选中的地区对象,应该就能解决这个报错了。
备注:内容来源于stack exchange,提问作者Saimuga
相关产品推荐
相关产品推荐

