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

在Spring Boot Thymeleaf中如何将对象列表传入th:value?

在Spring Boot Thymeleaf中给input传递对象列表的解决方案

嘿,我明白你现在的需求——想把List<OrgCategoryTagModel>对象列表传递给input的th:value,但直接写th:value="${tags}"肯定达不到预期效果,因为input的value只能是字符串,直接放对象列表的话,Thymeleaf只会调用列表的toString()方法,显示一堆类似[com.example.OrgCategoryTagModel@abc123, ...]的无用内容,后端也没法正确解析。下面给你几种针对性的解决方案:

1. 把列表中的属性拼接成字符串显示(适合展示标签场景)

如果你的需求是把列表里的标签名称(比如OrgCategoryTagModel里的tagName属性)拼接成逗号分隔的字符串,显示在input里,用Thymeleaf的#strings.join()方法结合投影操作就能实现:

修改你的input代码:

<input id="form-tags-1" name="tags-1" type="text" th:value="${#strings.join(tags.![tagName], ', ')}">
  • tags.![tagName]是Thymeleaf的投影语法,会提取tags列表中每个OrgCategoryTagModel对象的tagName属性,生成一个字符串列表;
  • #strings.join(...)把这个字符串列表用逗号加空格连接成一个完整的字符串,正好适合input的value属性。

注意:这里的tagName要替换成你OrgCategoryTagModel类中实际存储标签名称的属性名(比如如果是name就改成tags.![name])。

2. 提交整个对象列表到后端(适合批量提交场景)

如果你的目标是把整个对象列表提交给后端接口,那单个input的方式就不太合适了,推荐两种方案:

方案A:循环生成多个隐藏input

通过Thymeleaf的th:each循环遍历列表,为每个对象的属性生成对应的隐藏input,后端可以直接用List<OrgCategoryTagModel>接收:

<form action="@{/orgCategoryTag/create}" method="POST">
    <!-- 原有的表单元素 -->
    <div class="form-group">
        <label for="form-tags-1" class="text-dark font-bold">Add new tags</label>
        <input id="form-tags-1" name="tags-1" type="text" th:value="${#strings.join(tags.![tagName], ', ')}">
    </div>
    
    <!-- 新增:循环生成隐藏input传递完整标签数据 -->
    <th:block th:each="tag, stat : ${tags}">
        <input type="hidden" th:name="'tags[' + ${stat.index} + '].id'" th:value="${tag.id}">
        <input type="hidden" th:name="'tags[' + ${stat.index} + '].tagName'" th:value="${tag.tagName}">
        <!-- 如果还有其他属性,继续添加对应的hidden input -->
    </th:block>
    
    <a type="button" class="btn btn-success" href="#" data-placement="top" title="Tooltip on top">Add </a>
</form>

后端接收的时候,直接用@ModelAttribute List<OrgCategoryTagModel> tags或者在请求参数里接收即可。

方案B:把列表序列化为JSON字符串传递

如果列表结构比较复杂,不想生成太多input,可以把列表转成JSON字符串,放在一个隐藏input里,后端再解析成对象列表:

第一步,在后端的GetMapping里添加JSON序列化逻辑(Spring Boot默认已包含Jackson依赖):

@GetMapping(value = "/form")
public String categoryForm(Model model, BindingResult result) throws JsonProcessingException {
    Long testId = (long)1;
    OrgCategory orgCategory = new OrgCategory();
    List<OrgCategoryTagModel> orgCategoryTags = orgCategoryTagRestController.getAllByCategoryId(testId);
    
    // 把列表转成JSON字符串
    ObjectMapper objectMapper = new ObjectMapper();
    String tagsJson = objectMapper.writeValueAsString(orgCategoryTags);
    
    model.addAttribute("category", orgCategory);
    model.addAttribute("tags", orgCategoryTags);
    model.addAttribute("tagsJson", tagsJson); // 添加JSON字符串到Model
    model.addAttribute("add", true);
    return "orgCategoryForm";
}

第二步,前端添加隐藏input存储JSON字符串:

<input type="hidden" name="tagsJson" th:value="${tagsJson}">

第三步,后端接收并解析:

@PostMapping("/orgCategoryTag/create")
public String createTags(@RequestParam String tagsJson) throws JsonProcessingException {
    ObjectMapper objectMapper = new ObjectMapper();
    List<OrgCategoryTagModel> tags = objectMapper.readValue(tagsJson, new TypeReference<List<OrgCategoryTagModel>>(){});
    // 后续业务逻辑
    return "redirect:/some-page";
}

总结

  • 如果只是展示标签内容,用方案1的字符串拼接最直接;
  • 如果需要提交完整的标签数据,根据复杂度选择方案A(简单结构)或方案B(复杂结构)。

内容的提问来源于stack exchange,提问作者Nadyrbek Sultanov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:27:42