springBoot @RequestBody 获取函数转对象的操作的一些记录
1.controller
@RestController
@RequestMapping("/test")
public class TestController {
@PostMapping
public String testPost(@RequestBody testDto dto){
System.out.println("初始化成功:"+dto.toString());
return dto.toString();
}
}
2.testDto 对象
public class testDto {
private String str=null;
private Integer it=null;
private String[] stringList=null;
private List<String> lis=null;
public void setStr(String str) {
this.str = str;
System.out.println("setStr通过set反序列化");
}
public void setIt(Integer it) {
this.it = it;
System.out.println("setIt通过set反序列化");
}
public void setStringList(String[] stringList) {
this.stringList = stringList;
System.out.println("setStringList通过set反序列化");
}
public void setLis(List<String> lis) {
this.lis = lis;
System.out.println("setLis通过set反序列化");
}
public testDto() {
System.out.println("空构造函数初始化");
}
public testDto(String str, Integer it, String[] stringList, List<String> lis) {
this.str = str;
this.it = it;
this.stringList = stringList;
this.lis = lis;
System.out.println("通过构造函数反序列化");
}
@Override
public String toString() {
return "testDto{" +
"str='" + str + '\'' +
", it=" + it +
", stringList=" + Arrays.toString(stringList) +
", lis=" + lis +
'}';
}
}
3.请求
通过控制台的可以知道springBoot是先用空构造函数初始化一个对象
然后再通过set函数将数据设置到对象中。
修改请求的数据去掉一些数据
去掉list参数后会发现springBoot并不会给没传对的参数执行set方法
并且springBoot每一个新请求都会创建一个新的请求对象
由此可以在需要单独校验的属性的set方法中去实现具体的校验逻辑,这样子springBoot在执行反序列化时便会自动执行该校验逻辑。
但这个方法无法校验整个对象的数据都符合,因为没传递的参数并不会执行set方法,所以无法校验到没传递的参数,所以可以将对整个对象的校验单独创建一个方法,在speingBoot反序列化后手动执行该方法。
例如对象某个值不允许为空,但是如果用户在请求时没有传递该值,那么通过set方法无法校验出来,只能单独在设置方法校验。