Spring Boot中User类无参构造器导致Postman POST请求无法读取请求体
核心原因:JSON反序列化的机制差异
Spring Boot默认用Jackson库处理JSON序列化/反序列化,它创建对象的逻辑会因构造器的存在情况而不同:
1. 仅存在有参构造器时
当User类只有带参数的构造器时,Jackson会自动识别这个构造器,将JSON请求体中的键与构造器参数名匹配(默认兼容大小写差异,或通过getter命名规则映射)。比如构造器里的name参数,会对应JSON里的name字段,直接通过构造器给Name属性赋值,因此能正确读取请求体内容。
2. 添加无参构造器后
一旦添加无参构造器,Jackson会优先用它创建User对象,之后通过setter方法为属性赋值。但你的User类只有getter方法,没有对应的setter(比如setName()、setEmail()),导致Jackson无法把JSON中的值注入到属性里,最终得到的对象都是默认值(int类型Id为0,String类型字段为null),看起来像是没读取到请求体。
解决方案
你可以根据需求选择以下任意一种方案:
方案1:添加setter方法
保留无参构造器,为每个属性添加对应的setter方法,让Jackson完成属性赋值:
public class User { private int Id; private String Name; private String Email; private String Password; public User() {} public User(int id, String name, String email, String password) { Id = id; Name = name; Email = email; Password = password; } public int getId() { return Id; } public void setId(int id) { Id = id; } public String getName() { return Name; } public void setName(String name) { Name = name; } public String getEmail() { return Email; } public void setEmail(String email) { Email = email; } public String getPassword() { return Password; } public void setPassword(String password) { Password = password; } }
方案2:强制Jackson使用有参构造器
保留无参构造器,同时在有参构造器上添加@JsonCreator和@JsonProperty注解,指定Jackson优先用该构造器创建对象:
import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; public class User { private int Id; private String Name; private String Email; private String Password; public User() {} @JsonCreator public User(@JsonProperty("id") int id, @JsonProperty("name") String name, @JsonProperty("email") String email, @JsonProperty("password") String password) { Id = id; Name = name; Email = email; Password = password; } // 原有的getter方法不变 public int getId() { return Id; } public String getName() { return Name; } public String getEmail() { return Email; } public String getPassword() { return Password; } }
注:
@JsonProperty里的字符串要和Postman请求体中的JSON键名一致(比如你用大写Name,就写@JsonProperty("Name"))。
方案3:使用Lombok简化代码
如果项目引入了Lombok依赖,用@Data注解自动生成无参构造器、getter、setter等方法,避免手动编写重复代码:
import lombok.Data; @Data public class User { private int Id; private String Name; private String Email; private String Password; // 可保留有参构造器,也可用@AllArgsConstructor自动生成 public User(int id, String name, String email, String password) { Id = id; Name = name; Email = email; Password = password; } }
需确保pom.xml或build.gradle中添加了Lombok依赖。
内容的提问来源于stack exchange,提问作者Alex K

