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

如何使用th:field属性将HashMap与Thymeleaf单选按钮双向绑定

解决方法

第一步:修正模型类的Getter/Setter

Spring MVC数据绑定要求符合JavaBean规范,你需要为persons字段添加标准的Getter和Setter,不要使用自定义的getPerson/setPerson方法做绑定入口:

private HashMap persons = new HashMap();

// 新增标准Getter
public HashMap getPersons() {
    return persons;
}

// 新增标准Setter
public void setPersons(HashMap persons) {
    this.persons = persons;
}

// 原有自定义方法可以保留做其他业务使用
public void setPerson(String key, Object value) {
    this.persons.put(key, value);
}

public Object getPerson(String key) {
    return this.persons.get(key);
}

第二步:使用正确的Thymeleaf绑定语法

有两种可用的绑定方案,都同时支持数据回显+提交写入:

方案1:使用th:field自动绑定(推荐)

th:field绑定Map类型属性时,使用方括号[]访问指定key,不要用get()方法。同组单选的th:field值必须完全一致,才能归为同一组单选:

<input type="radio" th:field="*{persons['person1']}" value="0" />
<label>否</label>

<input type="radio" th:field="*{persons['person1']}" value="1" />
<label>是</label>

注意:要确保表单的th:object已经正确绑定到你的模型对象上,*{}是选择表达式,会从th:object指定的对象中读取属性。

方案2:手动绑定(自定义场景适用)

如果需要手动控制选中逻辑,修正name属性的写法,Spring数据绑定支持属性名['键名']的格式识别Map的key:

<input type="radio" value="0" name="persons['person1']" th:checked="*{persons['person1'] == '0'}" />
<label>否</label>

<input type="radio" value="1" name="persons['person1']" th:checked="*{persons['person1'] == '1'}" />
<label>是</label>

注意:如果你的Map中存储的是Integer类型的值,判断时要去掉引号,写成th:checked="*{persons['person1'] == 0}",避免类型不匹配导致回显失效。

后端接收注意事项

后端接收表单提交时,使用@ModelAttribute注解绑定你的模型类,Spring会自动完成属性注入:

@PostMapping("/save")
public String save(@ModelAttribute YourModelClass model) {
    // 此时model.getPersons().get("person1")已经可以拿到用户选中的值
    // 后续业务逻辑
}

内容的提问来源于stack exchange,提问作者nadeesha gimhana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:57:01