RequestBody注解的使用

  本文主要详细介绍一下@RequestBody注解的使用

1.@RequestBody用法介绍

1)@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的),传递的参数一定是一个字符串;
2)GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交;
3)在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。

2.@RequestBody注意事项

1)@RequestBody接收的是请求体里面的数据;而RequestParam接收的是key-value里面的参数如果参数是放在请求体中,传入后台的话,那么后台要用@RequestBody才能接收到;如果不是放在请求体中的话,那么后台接收前台传过来的参数时,要用@RequestParam来接收,或则形参前什么也不写也能接收。
2)后端@RequestBody注解对应的类在将HTTP的输入流(含请求体)装配到目标类(即:@RequestBody后面的类)时,会根据json字符串中的key来匹配对应实体类的属性,如果匹配一致且json中的该key对应的值符合(或可转换为),json字符串自动装配到对象中。

3.@RequestBody示例说明(重点)

需要用到的实体类如下:
User实体类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public class User {

/** 姓名 */
private String name;

/** 年龄 */
private Integer age;

/** 性别 */
private String gender;

/** 座右铭 */
private String motto;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}

public String getGender() {
return gender;
}

public void setGender(String gender) {
this.gender = gender;
}

public String getMotto() {
return motto;
}

public void setMotto(String motto) {
this.motto = motto;
}

@Override
public String toString() {

return age + "岁" + gender + "人[" + name + "]的座右铭居然是: " + motto + "!!!";
}

}

Team实体类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
public class Team {

/** id */
private Integer id;

/** 小组名字 */
private String teamName;

/** 所获称号 */
private List<String> honors;

/** 小组成员 */
private List<User> teamMembers;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getTeamName() {
return teamName;
}

public void setTeamName(String teamName) {
this.teamName = teamName;
}

public List<String> getHonors() {
return honors;
}

public void setHonors(List<String> honors) {
this.honors = honors;
}

public List<User> getTeamMembers() {
return teamMembers;
}

public void setTeamMembers(List<User> teamMembers) {
this.teamMembers = teamMembers;
}

/*
* 重写toString
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
// 遍历出小组所获荣耀
StringBuffer sbHonors = new StringBuffer("荣耀start----\n");
for (String honor : honors) {
sbHonors.append(honor);
sbHonors.append("\n");
}
sbHonors.append("荣耀end----\n");

// 遍历出小组成员
StringBuffer sbMembers = new StringBuffer("成员start----\n");
for (User user : teamMembers) {
sbMembers.append(user.toString());
sbMembers.append("\n");
}
sbMembers.append("成员end----\n");

return "小组id:" + id + "\n" + "小组名字:" + teamName + "\n" + "小组所获荣誉:"
+ sbHonors + "\n" + "小组成员:" + sbMembers;
}

}

3.1@RequestBody直接以String接收前端传过来的json数据

后端对应的Controller:

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 直接以String接收前端传过来的json数据
*
* @param jsonString
* @return json格式的字符串
*/
@RequestMapping("mytest0")
@ResponseBody
public String myTestController0(@RequestBody String jsonString) {
System.out.println(jsonString);
return jsonString;
}

使用PostMan测试:
@RequestBody示例1

3.2@RequestBody以简单对象接收前端传过来的json数据

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 以较简单的User对象接收前端传过来的json数据 (SpringMVC会智能的将符合要求的数据装配进该User对象中)
*
* @param user
* @return User重写后的toString
*/
@RequestMapping("mytest1")
@ResponseBody
public String myTestController1(@RequestBody User user) {
System.out.println(user.toString());
return user.toString();
}

使用PostMan测试:
@RequestBody示例2

3.3@RequestBody以复杂对象接收前端传过来的json数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 以较复杂的Team对象接收前端传过来的json数据 (SpringMVC会智能的将符合要求的数据装配进该Teamr对象中)
* 注:如果后端@RequestBody后的对象,持有了集合等,当前端向传参 令该对象持有的该集合为空时,json字符串中,
* 对应位置应该形如"teamMembers":[]这么写;即:传递的json字符串中必须要有key,否者请求会出错
*
*
* @param team
* @return Team重写后的toString
*/
@RequestMapping("mytest2")
@ResponseBody
public String myTestController2(@RequestBody Team team) {
System.out.println(team.toString());
return team.toString();
}

使用PostMan测试:
@RequestBody示例3

3.4@RequestBody与简单的@RequestParam()同时使用

1
2
3
4
5
6
7
8
9
10
11
12
/**
* @RequestBody与简单的@RequestParam()同时使用
*
* @param user
*/
@RequestMapping("mytest3")
@ResponseBody
public String myTestController3(@RequestBody User user, @RequestParam("token") String token) {
System.out.println(user.toString());
System.out.println(token);
return token + ">>>" + user.toString();
}

使用PostMan测试:
@RequestBody示例4

3.5@RequestBody接收请求体中的json数据;不加注解接收URL中的数据并组装为对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* @RequestBody装配请求体中的信息;
* 第二个参数不加注解,装配url中的参数信息
*
* @param user1
* @param user2
* @param token
*
* @return
*/
@RequestMapping("mytest4")
@ResponseBody
public String myTestController4(@RequestBody User user1, User user2) {
System.out.println(user1.toString());
System.out.println(user2.toString());
return user2.toString() + "\n" + user1.toString();
}

使用PostMan测试:
@RequestBody示例5

3.6@RequestBody与复杂的@RequestParam()同时使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* @RequestBody与复杂的@RequestParam()同时使用 注:这里 以集合 或者 以数组 接收数据都可以
*
* @param user
* @param arrays
* @return
*/
@RequestMapping("mytest5")
@ResponseBody
public String myTestController5(@RequestBody User user, @RequestParam("arrays") List<String> arrays) {
System.out.println(user.toString());
StringBuffer sb = new StringBuffer();
for (String array : arrays) {
sb.append(array);
sb.append(" ");
System.out.println(array);
}
return sb.toString() + user.toString();
}

使用PostMan测试:
@RequestBody示例6
说明:List arrays)接收参数前面必须加@RequestParam注解,否则接收不到数据,如果不想使用@RequestParam注解就需要将List arrays重新封装成一个对象

3.7无@RequestBody和@RequestParam()注解修饰的复杂类型使用

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 无@RequestBody@RequestParam()注解修饰的复杂类型使用
*
* @param team
* @return
*/
@RequestMapping("/mytest6")
@ResponseBody
public String myTestController6(Team team) {
System.out.println(team.toString());
return team.toString();
}

使用PostMan测试:
@RequestBody示例7