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("/")拿到的是临时解压路径,重启服务或者重新部署就会丢失,甚至可能因为路径不存在导致文件写入失败。
具体修复操作
- 修改locationReport.html里的图片标签,用Thymeleaf的路径语法自动绑定项目根路径,避免相对路径解析错误:
<!-- 替换原有img标签 --> <img th:src="@{/location.jpeg}" alt="Error in location image"> - (推荐优化)可以去掉图片落盘的逻辑,直接在Controller里生成JFreeChart对象后以输出流的方式写回响应,不需要在服务器存物理文件,既不会有路径问题,也不会产生冗余的磁盘文件。
内容的提问来源于stack exchange,提问作者Ajay Kumar
相关产品推荐
相关产品推荐

