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

Thymeleaf循环渲染时所有元素显示同一张图片问题求助

问题解决办法

1. 修正循环变量引用错误

首先检查循环变量的引用一致性:你的Thymeleaf循环应该定义当前元素的变量名,比如th:each="camp : ${randomSummerCamps}",然后img标签必须使用当前循环元素的图片字段,不能引用全局的无关变量(比如你之前用的randomImageSummerCamp),这是导致所有图片显示相同的核心原因。

示例循环结构:

<div th:each="camp : ${randomSummerCamps}">
  <h2 th:text="${camp.title}"></h2>
  <p th:text="${camp.state}"></p>
  <!-- 这里必须使用循环变量camp的图片属性 -->
  <img th:if="${camp.image != null}" alt="sample" th:src="|data:image/png;base64,${camp.imageBase64}|" src=""/>
</div>

2. 将MongoDB Binary对象转换为Base64字符串

直接拼接org.bson.types.Binary对象会得到它的toString结果(如org.bson.types.Binary@96e8964c),这不是有效的Base64编码,必须把它的字节数组转成Base64字符串,有两种实现方式:

方法一:实体类添加转换方法

在你的实体类中新增一个getter方法,专门返回图片的Base64编码字符串:

import org.bson.types.Binary;
import java.util.Base64;

public class SummerCamp {
    private String title;
    private String state;
    private Binary image;

    // 原有getter、setter方法
    public String getImageBase64() {
        if (image == null) {
            return null;
        }
        // 将Binary中的字节数组编码为Base64字符串
        return Base64.getEncoder().encodeToString(image.getData());
    }
}

方法二:Thymeleaf中直接调用工具类转换

如果不想修改实体类,可以在Thymeleaf中直接使用Spring的Base64Utils工具类(需确保项目引入Spring相关依赖):

<img th:if="${camp.image != null}" alt="sample" 
     th:src="|data:image/png;base64,${T(org.springframework.util.Base64Utils).encodeToString(camp.image.getData())}|" 
     src=""/>

3. 验证最终效果

完成上述修改后,循环中的每个元素会读取自身对应的Binary对象,转换为正确的Base64编码后渲染图片,就能解决所有图片显示相同的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:30:49