686
社区成员




这个作业属于哪个课程 | <2023年福大-软件工程实践-W班> |
---|---|
这个作业要求在哪里 | <软件工程实践总结&个人技术博客> |
这个作业的目标 | 进行个人技术总结 |
其他参考文献 | 《构建之法》、CSDN社区 |
在团队项目开发过程中,有时候会遇到维系两个一对多关系的中间表在接受前端传递的参数中包含复杂对象数组的问题,如果单纯使用@RequestParam注解则无法解析请求体中的数据
在SpringMVC和SpringBoot中,有时候我们会遇到后端接口需要接受前端复杂的对象数组,或者多个对象数组。这时,我们可以使用@RequestBody注解来解析请求体中的数据。
@RequestBody 是一个用于处理 HTTP 请求的注解,通常与 POST 请求一起使用。它将 HTTP 请求的请求体插入到方法参数中,并使用系统默认的 HttpMessageConverter 将请求体中的数据解析为 Java 对象。该注解主要用于读取请求体中的数据,并将其绑定到要返回的对象上。同时,@RequestBody 注解还可以与 @ResquestParam 注解一起使用,以便在同一接口中处理多个参数。但请注意,前者最多只能有一个,后者可以有多个。
首先,需要定义一个Java对象类,用于表示复杂对象数组。例如,假设需要接收一个包含学生信息的数组,
可以定义一个Student类:
public class Student {
private String name;
private int age;
private String major;
// 省略getter和setter方法
}
接下来,创建一个Controller来接收包含学生信息的复杂对象数组。可以在方法参数上使用@RequestBody注解,并指定需要转换的Java对象类:
@RestController
@RequestMapping("/students")
public class StudentController {
@PostMapping("/create")
public Object createStudents(@RequestBody List<Student> students) {
// 处理学生信息数组的逻辑
return students;
}
}
相应地,进行前端数据请求编写,通过 XMLHttpRequest 对象将复杂对象数组作为请求体的一部分发送给服务器
$.ajax({
type: "post",
url: "http://localhost:8080/students/create",
contentType: 'application/json;charset=utf-8',
data: JSON.stringify([
{
"name": "香坊",
"age": 18,
"major": "汉语言文学"
}, {
"name": "朝歌",
"age": 20,
"major": "国际关系"
}
]),
success: function (res) {}
});
如果需要接收的复杂对象数组中包含嵌套的对象或数组,需要在Java对象类中定义相应的属性,并使用相应的注解进行标记。例如,如果需要接收一个包含学生信息和课程信息的嵌套数组,可以定义一个StudentCourse类:
public class StudentCourse {
private Student student;
private List<String> courses;
// 省略getter和setter方法
}
在上面的代码中,定义了一个包含学生信息和课程信息的嵌套数组。在控制器方法中,可以使用相应的注解进行标记:
@RestController
@RequestMapping("/students")
public class StudentController {
@PostMapping("/create")
public Object createStudents(@RequestBody List<StudentCourse> studentCourses) {
// 处理学生信息和课程信息的逻辑
return studentCourses;
}
}
相应地,将嵌套数组作为请求体的一部分发送给服务器
$.ajax({
type: "post",
url: "http://localhost:8080/students/create",
contentType: 'application/json;charset=utf-8',
data: JSON.stringify([
{
student: {
"name": "香坊",
"age": 18,
"major": "汉语言文学"
},
courses: ['文学概论', '语言学概论','中国文学批评史']
},
{
student: {
"name": "朝歌",
"age": 20,
"major": "国际关系"
},
courses: ['国际关系理论', '国际政治概论', '政治学基础']
}
]),
success: function (res) {}
});
运行时遇到 “Required request body is missing” 异常
可能是因为代码使用了Get请求,而使用了RequestBody注解进行数据封装。GET请求是不能进行这种方式的操作,
因为GET请求没有请求体,所以当我们使用RequsetBody注解封装Get请求的数据时就会出现无法获取到数据的情况
最好是将请求方式转换成POST,PUT,DELETE等请求方式
处理HTTP请求时遇到 ”Content type 'application/json;charset=UTF-8' not supported“ 报错
可能是因为pom.xml缺少jackson包引用 ,并且jackson需要版本大于2,或者在后端接收参数中,
存在Map<ObjectA, ObjectB>类型的数据结构,jackson不支持解析Map<ObjectA, ObjectB>这种数据结构
通过上述方法可以实现使用@RequestBody注解进行接收复杂对象数组
SpringMVC和SpringBoot 接收复杂集合参数,集合对象
SpringBoot 不同请求方式下接收List 入参总结
SpringBoot 后台接收对象和对象集合