关于@RequestBody注解未能够成功解析对象的原因分析

  • 前端请求形式问题:请求未放在请求体body里面、请求体里面传入的是json对象

@RequestBody注解只能接收json对象的字符串,不能接收Json对象。如果前端传入的是Json对象,需要使用JSON.stringify(data)的方式将对象变成字符串,同时ajax请求也要指定dataType: “json”,contentType:“application/json”12。

如果要保留前端内容不变,修改后端的话,当使用@RequestBody注解接收Json对象时,可以在函数头上加上@Valid注解,同时在实体类中使用@Valid注解对属性进行校验。

@RequestMapping("/verificationCode")
public responseMessage verificationCode(@Valid @RequestBody PhoneMessage phoneMessage) {
    System.out.println("get userPhone : " + phoneMessage.toString());
    return verificationCodeService.getResponse(phoneMessage.phone);
}

注意@valid注解需要添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

 如果你已经添加了这个依赖,但仍然出现了这个问题,那么你可以尝试使用以下命令清除Maven本地存储库中的缓存:

mvn dependency:purge-local-repository
  • 后端解析配置问题:

@RequestBody注解对应的类在将HTTP的输入流(含请求体)装配到目标类(即:@RequestBody后面的类)时,会根据json字符串中的key来匹配对应实体类的属性,如果匹配一致且json中的该key对应的值符合(或可转换为)该属性的类型,那么就会将该值赋给该属性。因此,对于该对象属性的要求如下:

  • 类中必须有对应属性名的get/set方法
  • 类中必须有无参构造函数
  • 属性类型必须与json字符串中对应key的value类型一致或可转换为该类型 
  • 检查属性名称是否和前端发送的数据格式一致

例如:

@Data注解会自动生成getter、setter、equals、canEqual、hashCode、toString方法,以及无参构造方法。

@Data
public class PhoneMessage {
    @JsonProperty("userPhone")
    public String phone;

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

@RestController
public class VerificationCodeController {

    @Autowired
    public VerificationCodeService verificationCodeService;

    @RequestMapping("/verificationCode")
    public responseMessage verificationCode(@RequestBody @Valid PhoneMessage phoneMessage) {
        System.out.println("get userPhone : " + phoneMessage.toString());
        return verificationCodeService.getResponse(phoneMessage.phone);
    }

    @RequestMapping("/verificationCode1")
    public responseMessage verificationCode02(@RequestBody String message) {
        System.out.println("get userPhone : " + message);
        return verificationCodeService.getResponse(message);
    }

}

 如果不加@JsonProperty("userPhone")就一直出错了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值