Spring Boot实体无getter/setter返回406错误问题咨询
问题根因说明
Spring Boot 中@RestController标注的接口,默认使用内置的Jackson组件完成返回对象到JSON的序列化工作,整个序列化流程遵循Jackson的默认访问规则:
- 默认情况下,Jackson只会扫描类的public修饰的getter方法作为JSON属性的取值来源,不会直接读取非public修饰的成员变量。
- 示例中的
UserDetails类里,userid和username两个属性都是包级访问权限(无访问修饰符),且类中没有提供public的getter方法,Jackson扫描该类时找不到任何可序列化的属性,无法生成符合要求的JSON响应体,因此抛出HttpMediaTypeNotAcceptableException异常,最终返回406 Not Acceptable状态码。 - 为实体类补充public的getter方法后,Jackson可以通过
getUserid()、getUsername()方法获取到两个属性的值,即可正常完成JSON序列化,返回预期的响应结构。
相关代码示例
异常场景的实体类代码
package com.example.VideoVerification.request; public class UserDetails { String userid; String username; public UserDetails(String userid, String username) { this.username = username; this.userid = userid; } // 未编写public修饰的getter/setter方法 }
接口代码
package com.example.VideoVerification.controller; import com.example.VideoVerification.request.UserDetails; import org.springframework.web.bind.annotation.*; @RestController public class APIController { @PostMapping(value = "/getUserDetails") public UserDetails getUserDetails() { return new UserDetails("1111","Tom"); } }
异常响应
{ "timestamp": "2022-06-03T16:46:14.562+00:00", "status": 406, "error": "Not Acceptable", "path": "/getUserDetails" }
控制台异常信息:
org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
正常响应(补充getter后)
{ "userid": "1111", "username": "Tom" }
不写getter/setter的替代方案
如果不想手动编写getter/setter方法,可以选择以下两种方案实现正常序列化:
- 方案1:配置Jackson的字段可见性,在实体类上添加
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)注解,让Jackson直接读取类的所有成员变量,无需依赖getter方法:
package com.example.VideoVerification.request; import com.fasterxml.jackson.annotation.JsonAutoDetect; @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) public class UserDetails { String userid; String username; public UserDetails(String userid, String username) { this.username = username; this.userid = userid; } }
- 方案2:引入Lombok依赖,在实体类上添加
@Data注解,由Lombok在编译期自动生成getter/setter、toString等通用方法,无需手动编码。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

