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

Thymeleaf th:onclick传递复杂对象为空,是否仅支持简单类型参数?

Thymeleaf th:onclick 传递复杂对象问题解答

核心结论

  • 你遇到的现象是Thymeleaf的正常行为,并非th:onclick不支持传递复杂对象,问题根因是复杂对象的序列化方式错误。
  • 简单类型(字符串、数字等)可以正常传递读取,是因为Thymeleaf渲染时会直接输出对应值;而直接写${employee}时,Thymeleaf默认调用该对象的toString()方法,如果你没有重写该方法输出JSON格式字符串,最终渲染到HTML里的是类似com.xxx.Employee@123456的类名+哈希值字符串,JS自然无法读取到对象属性。

解决方案

方案1:序列化对象为JSON传递(推荐)

SpringBoot项目默认集成Jackson序列化工具,Thymeleaf可直接调用内置的#objectMapper工具将对象转为JSON字符串,JS侧再反序列化即可拿到完整对象。
修改后的模板代码如下:

<td>
  <button 
    th:data-parameter1="${#objectMapper.writeValueAsString(employee)}" 
    th:onclick="afficherDetails(JSON.parse(this.getAttribute('data-parameter1')))"
  >
    details
  </button>
</td>

原JS的afficherDetails函数无需修改,即可正常读取employee的各个属性。

注:如果使用非SpringBoot项目或低版本Thymeleaf没有内置#objectMapper,可以自行封装JSON序列化工具类,在Thymeleaf中调用自定义工具类完成对象转JSON即可。

方案2:逐字段传递

如果需要用到的属性较少,也可以直接把需要的字段逐个作为参数传递:

<td>
  <button 
    th:onclick="afficherDetails(
      [[${employee.firstName}]],
      [[${employee.lastName}]],
      [[${employee.address}]],
      [[${employee.title}]],
      [[${employee.manager}]]
    )"
  >
    details
  </button>
</td>

对应修改JS函数接收对应参数即可:

function afficherDetails(firstName, lastName, address, title, manager) {
  document.getElementById("detailledFirstNameDataLabelId").textContent = firstName;
  document.getElementById("detailledLastNameDataLabelId").textContent = lastName;
  document.getElementById("detailledAddressDataLabelId").textContent = address;
  document.getElementById("detailledTitleDataLabelId").textContent = title;
  document.getElementById("detailledManagerDataLabelId").textContent = manager;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:57:03