SpringBoot中调用createCategory POST接口返回Bad Request问题排查求助
首先明确一点:Spring完全支持仅包含单个变量的请求体,你的问题和字段数量无关,大概率是DTO的序列化/反序列化配置出了问题。
从你提供的代码来看,CreateCategory类只加了@AllArgsConstructor和@Builder,但缺少了Jackson反序列化所需的无参构造函数——这是导致Bad Request的核心原因。
为什么会出现这个问题?
Spring默认使用Jackson处理JSON的序列化/反序列化,当Jackson尝试将请求体的JSON转换为CreateCategory对象时,它需要一个无参构造函数来实例化对象,再通过反射赋值填充字段。你的DTO只有全参构造函数,且没有告诉Jackson如何使用这个构造函数来创建对象,所以Jackson无法完成反序列化,最终返回Bad Request。
解决方法(任选其一即可)
1. 添加无参构造函数(推荐)
通过Lombok的@NoArgsConstructor注解添加无参构造,因为你用了@Builder,可以把无参构造设为私有,避免外部直接实例化:
@Getter @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PRIVATE) // 添加这一行 public class CreateCategory { @NotNull private final String name; }
2. 标记构造函数为Jackson可用
如果不想加无参构造,可以用@JsonCreator和@JsonProperty标记全参构造函数,告诉Jackson用这个构造函数来创建对象:
@Getter @Builder @AllArgsConstructor public class CreateCategory { @NotNull private final String name; @JsonCreator // 添加这一行 public CreateCategory(@JsonProperty("name") String name) { // 显式指定JsonProperty this.name = name; } }
3. 检查请求头
确认你的请求头中包含Content-Type: application/json,如果缺少这个头,Spring可能无法正确识别请求体格式,也会返回Bad Request。
额外排查建议
如果以上方法都没解决问题,可以开启Spring的DEBUG日志,查看具体的错误信息:
在application.properties中添加:
logging.level.org.springframework.web=DEBUG logging.level.com.fasterxml.jackson=DEBUG
这样你就能看到Jackson反序列化时的具体异常,更快定位问题。
内容的提问来源于stack exchange,提问作者Fen

