- 前端请求形式问题:请求未放在请求体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")就一直出错了