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

Spring Boot控制器响应序列化失败致500错误的原因排查

问题分析:Spring Boot返回500错误(响应序列化相关)

请求能正常到达Spring Boot控制器,但服务器返回500状态码,单独返回User对象时可正常工作,推测问题与响应序列化有关,相关代码如下:

控制器代码

@PostMapping(path = "/add",produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Object> addUser(Users user) {
    users.clear();
    users.add(user);
    ServiceResponse<Users> response = new ServiceResponse<Users>("success", users);
    return new ResponseEntity(response,HttpStatus.OK);
}

ServiceResponse类代码

public class ServiceResponse<T> {

    private String status;
    private List<T> data;

    public ServiceResponse(String status, List<T> data) {
        this.status = status;
        this.data = data;
    }

}

前端Ajax代码

function ajaxPost() {
    // DO POST
    $.ajax(
 document.location.origin+"/users/add",{
        method: "POST",
        data: $("#userForm").serialize(),
        dataType : 'json',
        success : function(result) {
            if (result!=null) {
                $("#postResultDiv").html(
                    "" + result.data.userName
                    + "Post Successfully! <br>"
                    + "---&gt; Congrats !!" + "</p>");
            } else {
                $("#postResultDiv").html("<strong>Error</strong>");
            }
            console.log(result);
        },
        error : function(e) {
            alert("Error!")
            console.log("ERROR: ", e);
        }
    });
}

问题原因

  • 缺少无参构造函数:Spring Boot默认使用Jackson进行JSON序列化,Jackson需要目标类提供无参构造函数才能实例化对象完成序列化,而ServiceResponse仅定义了带参构造函数,导致序列化失败抛出异常,返回500状态码。
  • 缺少属性getter方法:Jackson序列化时需要通过getter方法访问类的属性值,ServiceResponse的status和data字段没有对应的getter方法,无法读取属性内容,同样会引发序列化异常。

解决方案

修改ServiceResponse类,补充无参构造函数和属性getter方法:

public class ServiceResponse<T> {

    private String status;
    private List<T> data;

    // 添加无参构造函数
    public ServiceResponse() {
    }

    public ServiceResponse(String status, List<T> data) {
        this.status = status;
        this.data = data;
    }

    // 添加status字段的getter
    public String getStatus() {
        return status;
    }

    // 添加data字段的getter
    public List<T> getData() {
        return data;
    }
}

另外,前端代码存在一处逻辑错误:result.data.userName写法错误,因为data是List集合,需要通过索引访问元素,应改为result.data[0].userName,否则前端成功回调会因无法读取属性而报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 09:12:58