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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 13:43:10