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

Spring+Thymeleaf+Datatables报错:Cannot read property 'length' of undefined

解决Datatables加载JSON数组时的Cannot read property 'length' of undefined错误

这个问题我之前也碰到过,核心原因是Datatables默认期望的JSON响应是一个包含data属性的对象,但你的Controller直接返回了纯用户数组,没有用data字段包裹。当Datatables尝试读取响应里的data属性时,发现它是undefined,自然就会抛出"Cannot read property 'length' of undefined"的错误。

下面给你两种可行的解决方案,根据你的需求选一种就行:

方案一:修改Controller返回标准Datatables格式

这种方式更规范,后续如果要加分页、排序功能也更容易扩展。只需要把返回的用户列表包装到一个含data属性的对象里,可以用HashMap或者自定义响应类:

@RequestMapping(value = "/users/list", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
public Map<String, Object> listOfUsers() {
    List<User> usersList = userService.getAllUsers();
    Map<String, Object> response = new HashMap<>();
    response.put("data", usersList); // 把列表放到data字段下
    return response;
}

修改后返回的JSON结构会变成:

{
  "data": [
    {
      "id":1,
      "username":"dinesh@example.com",
      "firstName":"dinesh",
      "lastName":"damian",
      // ... 其他字段
    }
  ]
}

这样Datatables就能正常识别数据源了。

方案二:修改Datatables配置,适配现有返回格式

如果不想改Controller,可以在Datatables的AJAX配置里添加dataSrc: '',告诉它直接使用返回的数组作为数据源,不需要找data字段。另外还要注意你JSON里的roleName是嵌套在role对象里的,之前的列配置写法会找不到这个值,得改成role.roleName:

$(document).ready(function () {
    $('#usersTable').DataTable({
        "processing": true,
        dataType: 'json',
        "ajax": {
            "url": "http://localhost:8080/sample/users/list",
            "type": "GET",
            "dataSrc": "" // 关键配置:直接使用返回的数组
        },
        "columns": [
            {"data": "username"},
            {"data": "firstName"},
            {"data": "lastName"},
            {"data": "status"},
            {"data": "role.roleName"} // 修正嵌套字段的路径
        ]
    })
});

最后提个小细节:你给出的JSON示例里,firstName和lastName的值没有加双引号(比如"firstName":dinesh),这是无效的JSON格式,要确保你的Controller返回的是合法的JSON——字符串类型的字段值必须用双引号包裹,否则也可能导致解析失败哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:17:40