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

如何在Spring Boot中结合Chart.js实现控制器数据传递至图表

解决Spring Boot控制器数据传递到Chart.js的问题

我来帮你搞定这个困扰你三天的问题!核心问题在于前端没有正确从后端接口获取数据并传递给Chart.js,咱们一步步来修复:


第一步:优化Spring Boot控制器,确保正确返回JSON

你现在手动将JsonObject转成字符串返回,容易出现格式错误。Spring Boot可以自动处理JSON序列化,推荐改成下面的写法:

// 确保控制器类标注了@RestController,或者在方法上添加@ResponseBody
@RequestMapping("/chartline")
@ResponseBody
public Map<String, List<String>> chartLine() {
    List<String> formNames = formrepo.findFormationNames();
    Map<String, List<String>> response = new HashMap<>();
    response.put("formNames", formNames);
    return response;
}

这样Spring会自动把Map序列化为标准JSON格式({"formNames": ["数据1", "数据2", ...]}),比手动拼接更可靠。

如果需要允许跨域访问(比如前后端端口不同),可以在方法上添加@CrossOrigin注解:

@CrossOrigin(origins = "http://localhost:8080") // 替换为你的前端域名
@RequestMapping("/chartline")
@ResponseBody
public Map<String, List<String>> chartLine() {
    // ... 上述代码
}

第二步:前端通过AJAX获取数据并初始化Chart.js

你原来的代码是硬写死了formNames数组,现在需要先请求后端接口拿到数据,再创建Chart实例。这里用原生fetch API实现(也可以用jQuery的ajax):

// 获取canvas元素
var ctx = document.getElementById("myAreaChart");

// 请求后端接口获取数据
fetch('/chartline')
    .then(response => response.json())
    .then(data => {
        // 从返回的JSON中提取formNames数组
        var formNames = data.formNames;
        
        // 初始化Chart.js
        var myLineChart = new Chart(ctx, {
            type: 'line',
            data: {
                labels: formNames,
                datasets: [{
                    label: "Earnings",
                    lineTension: 0.3,
                    backgroundColor: "rgba(78, 115, 223, 0.05)",
                    borderColor: "rgba(78, 115, 223, 1)",
                    pointRadius: 3,
                    pointBackgroundColor: "rgba(78, 115, 223, 1)",
                    pointBorderColor: "rgba(78, 115, 223, 1)",
                    pointHoverRadius: 3,
                    pointHoverBackgroundColor: "rgba(78, 115, 223, 1)",
                    pointHoverBorderColor: "rgba(78, 115, 223, 1)",
                    pointHitRadius: 10,
                    pointBorderWidth: 2,
                    data: [0, 10000, 5000, 15000, 10000, 20000, 15000, 25000, 20000, 30000, 25000, 40000],
                }],
            },
            options: {
                responsive: true,
                maintainAspectRatio: false
            }
        });
    })
    .catch(error => {
        // 请求失败时用默认数据兜底
        console.error('获取数据失败:', error);
        var defaultFormNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
        var myLineChart = new Chart(ctx, {
            type: 'line',
            data: {
                labels: defaultFormNames,
                datasets: [{ /* 保持原数据集配置 */ }]
            }
        });
    });

第三步:验证与排查

  1. 打开浏览器控制台的Network标签,查看/chartline请求是否成功,返回的JSON格式是否正确
  2. 确保前端请求的路径和后端接口路径一致(如果项目有上下文路径,需要加上,比如/your-app/chartline)
  3. JSP部分无需改动,保持原有的canvas元素即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 15:37:28