@RequestBody接收实体为空

博客主要围绕Spring Boot和Vue开发中出现的问题展开。前端传值时,后端接受对象值为空,添加@JsonProperty也无法解决。给出两种解决办法,一是传值时不要加{},二是将各个属性的值单独提出来传。

问题:

实体对象:
在这里插入图片描述
Controller:
在这里插入图片描述
前端传值:
在这里插入图片描述
后端接受对象值为空,添加@JsonProperty也没用

解决1:

在这里插入图片描述
不要加{}

解决2:

在这里插入图片描述
将各个属性的值单独提出来传

在使用 Spring Boot 开发 Web 应用时,`@RequestBody` 是一个非常常见的注解,用于将 HTTP 请求体中的 JSON 数据自动映射到 Java 对象上。然而,在实际开发中,经常会出现 `@RequestBody` 接收实体类字段值为 `null` 的问题。以下是几种常见原因及对应的解决方案: ### 1. JSON 字段名与实体类字段名不匹配 当客户端发送的 JSON 字段名与 Java 实体类的字段名不一致时,Jackson 无法正确映射字段值。例如,JSON 中使用的是 `userName`,而实体类字段名为 `username`,这种不一致会导致字段值为 `null` [^1]。 **解决方案:** 可以使用 `@JsonProperty` 注解明确指定 JSON 字段名与 Java 字段的映射关系。例如: ```java public class User { @JsonProperty("userName") private String username; // getter and setter } ``` 这样,即使 JSON 中的字段名为 `userName`,也能正确映射到 `username` 字段上 [^1]。 ### 2. 使用了错误的包或注解 有时候,开发者可能会误导入了错误的 `@RequestBody` 注解包,例如导入了 `javax.servlet.http` 包下的类,而不是 Spring 提供的 `org.springframework.web.bind.annotation.RequestBody`。这会导致 Spring 无法识别该注解,从而无法正确绑定参数 [^2]。 **解决方案:** 确保导入的 `@RequestBody` 注解是 Spring 提供的版本: ```java import org.springframework.web.bind.annotation.RequestBody; ``` ### 3. 请求体被提前读取导致无法解析 在某些场景下,开发者可能会在 `Filter` 或 `Interceptor` 中提前读取了 `request.getInputStream()`,从而导致请求体已经被消费,后续的 `@RequestBody` 注解无法再次读取内容,最终导致字段值为 `null` [^3]。 **解决方案:** 可以使用 `ContentCachingRequestWrapper` 来包装原始的 `HttpServletRequest`,从而实现对请求体的多次读取。例如在 `Filter` 中: ```java @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper((HttpServletRequest) request); chain.doFilter(wrappedRequest, response); } ``` 通过这种方式,可以在不消耗原始请求体的情况下读取其内容 [^3]。 ### 4. Jackson 配置问题 Spring Boot 默认使用 Jackson 来解析 JSON 数据。如果 Jackson 的配置不正确,例如禁用了某些必要的特性,也可能导致字段映射失败。 **解决方案:** 检查 `application.yml` 或 `application.properties` 中的 Jackson 配置,确保没有禁用必要的功能。例如,确保以下配置未被错误设置: ```yaml spring: jackson: deserialization: fail-on-unknown-properties: false ``` ### 5. 实体类缺少 setter 方法 Jackson 在反序列化 JSON 数据时,依赖于字段的 setter 方法。如果某个字段没有提供 setter 方法,Jackson 将无法设置其值,从而导致该字段为 `null`。 **解决方案:** 为实体类中的所有字段提供 setter 方法,或者使用 Lombok 的 `@Data` 注解自动生成 getter 和 setter 方法: ```java import lombok.Data; @Data public class User { private String username; private String email; } ``` ### 6. JSON 数据格式错误 如果客户端发送的 JSON 数据格式不正确,例如字段名未加引号、缺少逗号等,Jackson 将无法正确解析整个 JSON 数据,导致部分字段映射失败。 **解决方案:** 确保客户端发送的 JSON 数据格式正确。可以使用在线 JSON 验证工具进行检查。 ### 7. 使用 `@RequestBody` 注解的参数位置错误 在 Spring MVC 中,`@RequestBody` 注解的参数必须是方法参数中的唯一一个,且不能与其他参数混用(如 `@RequestParam`、`@PathVariable` 等)。 **解决方案:** 确保 `@RequestBody` 注解的参数是方法参数中的唯一一个,或者将其放在方法参数的最后。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值