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

IntelliJ中Spring Boot项目浏览器无法加载JFreeChart生成的图片

Spring Boot集成JFreeChart生成饼图无法在浏览器加载问题

问题现象

集成JFree Chart API的Spring Boot项目中,将数据库数据生成饼图后尝试在浏览器展示,出现饼图加载失败的问题。

  • 异常截图:
    异常截图
  • 项目结构截图:
    项目结构截图
  • 图片生成位置截图:
    图片位置截图

备注:已添加Thymeleaf依赖,项目其他功能均可正常运行,图片已成功生成在webapp根目录,但始终无法在浏览器中加载。

相关代码

页面代码(templates/locationReport.html)

用于展示jpeg格式饼图:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Location Report</title>
</head>
<body>
<img src="location.jpeg" alt="Error in location image">
</body>
</html>

Controller层代码

@Controller
@RequestMapping("/api/v1/")
public class LocationController {
    @RequestMapping(value = "/generateReport")
    public String generateLocationReport() throws IOException {
        locationService.generateLocationReport();
        return "locationReport";
    }
}

Service实现类代码(LocationServiceImpl)

@Autowired
private ServletContext servletContext;

@Override
public void generateLocationReport() throws IOException {
    String path = servletContext.getRealPath("/");
    List<Object[]> data = locationRepository.findTypeAndTypeCount();
    reportUtil.generatePieChart(path, data);
}

Repository层代码(LocationRepository)

@Query(value="SELECT loc.type, COUNT(loc) FROM Location loc GROUP BY loc.type")
List<Object[]> findTypeAndTypeCount();

工具类代码(ReportUtil)

@Override
public void generatePieChart(String path, List<Object[]> data) throws IOException {
    DefaultPieDataset dataset = new DefaultPieDataset();
    for (Object[] object : data) {
        dataset.setValue(object[0].toString(), Double.valueOf(object[1].toString()));
    }

    JFreeChart locationChart = ChartFactory.createPieChart3D("Location Report", dataset);

    ChartUtils.saveChartAsJPEG(new File(path+"/location.jpeg"),locationChart,300,300);
}

问题原因&修复方案

核心问题是图片引用路径错误:

  • 你访问生成报告页面的路径是/api/v1/generateReport,页面里img标签写的相对路径location.jpeg,浏览器会默认从当前接口的同级路径找资源,也就是请求/api/v1/location.jpeg,但你实际把图片存在webapp根目录,对应正确访问路径是/location.jpeg,路径不匹配直接返回404,所以图片加载不出来。
  • 额外提醒:把运行时生成的文件存在webapp目录不是可靠方案,如果项目用jar包方式部署,servletContext.getRealPath("/")拿到的是临时解压路径,重启服务或者重新部署就会丢失,甚至可能因为路径不存在导致文件写入失败。

具体修复操作

  1. 修改locationReport.html里的图片标签,用Thymeleaf的路径语法自动绑定项目根路径,避免相对路径解析错误:
    <!-- 替换原有img标签 -->
    <img th:src="@{/location.jpeg}" alt="Error in location image">
    
  2. (推荐优化)可以去掉图片落盘的逻辑,直接在Controller里生成JFreeChart对象后以输出流的方式写回响应,不需要在服务器存物理文件,既不会有路径问题,也不会产生冗余的磁盘文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:06:22