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>" + "---> 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
相关产品推荐
相关产品推荐

