今天将前端请求由键值对改为json请求后,原来写的验证码模块怎么也验证不成功,很是郁梦啊,后来看日志才知道是通过@RequestBody绑过来的单个对象是json字符串,而不是我想要的直接的String值,难怪怎么就出错了呢,为了避免出错,以后还是通过改成map来绑定吧,不管是单个对象还是多个,map取值也很方便,是吧,特此记录下,值得一提的是,不管你用了多少个@RequestBody,它只会全部绑定在第一个参数中,切记
@PostMapping(value = "/test")
public void test(@RequestBody String username){
System.out.println(username);
String name = JSONObject.toJSONString(username);
System.out.println(name);
}
@PostMapping("/test2")
public void test2(@RequestBody User user){
System.out.println(user.getNickname());
System.out.println(user.getEmail());
System.out.println(user.getPassword());
}
User 对象有三个属性nickname,email,password,构造函数User(String nickname, String email,String password)
先来看看绑过来的username是个什么:
控制台打印的username为:
并不是我们期望的daniel,而是一个Json字符串,那么我们怎么取出username的值呢,目前想到的方法
1、改用Map<String,String> map绑定username,然后通过map.get("username")取值
2、使用com,alibaba.fastjson包将json字符串转换为Json 对象,在通过get方法取出username值
@PostMapping(value = "/test")
public void test(@RequestBody String username){
System.out.println(username);//json字符串
JSONObject object = JSON.parseObject(username); //解析成json对象
String name = object.getString("username"); //通过get方法取值,根据不同的key有不同的get方法,比如getString(),getInteger(),getBytes()等等
System.out.println(name);
}
再来看看User绑过来没有?
如果少一个属性呢
如果添加一个对象中不存在的属性呢
注意其中的age属性不存在于User对象中
控制台不会报错,但是我们怎么取出这个没有的age属性呢?不知道,还是别这么做吧,额