下面是详细的攻略。
解读 SpringBoot 接收 List\ 参数问题
当我们在开发Web应用时,经常需要处理从前端接收到的参数。在某些情况下,我们可能需要接收一个 List<Bean>
类型的参数。本文将介绍如何正确处理这种情况。
HTTP POST 请求
HTTP 是一个无状态的协议,每个 HTTP 请求应该是独立的。在 Web 应用中,常见的 HTTP 请求有 GET 和 POST 两种方式。GET 请求通常用于简单的数据查询,而 POST 请求则用于向服务器提交数据。
对于 POST 请求,客户端(前端)通常会通过 HTTP Request Body 来提交数据,而不是 GET 请求中的 URL 参数。这意味着在服务器端处理 POST 请求时,我们需要解析 Request Body,将其转换为对应的数据结构。
对于 SpringBoot 应用程序,我们可以使用 @RequestBody
注解来自动解析 Request Body。
接收 List\ 参数
假设我们需要编写一个 RESTFul 接口,接受一个 List<User>
类型的参数。
@PostMapping("/users")
public void saveUsers(@RequestBody List<User> userList) {
// to do ...
}
在前端进行POST请求时,可以按照下面的方式进行请求:
// 假设有两个用户信息需要提交
const users = [{
name: '张三',
age: 20
},
{
name: '李四',
age: 22
}
];
fetch('/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(users)
})
可以看到,提交的数据是一个 JSON 字符串,我们需要使用 Content-Type: application/json
来指定 Request Body 的类型。
解决问题
然而,如果我们直接使用上述的代码请求,并没有做任何额外操作,那么我们得到的 userList
参数是无法正确解析的。这是因为服务器端并不知道如何将 JSON 的字符串转换为 Java 对象。
这时,我们可以使用 @RequestBody
注解和 HttpMessageConverter
来将 JSON 字符串转换为 Java 对象。
@RequestBody
注解
在控制器方法中,使用 @RequestBody
注解来将 HTTP Request Body 转换为 Java 对象。
@PostMapping("/users")
public void saveUsers(@RequestBody List<User> userList) {
// to do ...
}
- HttpMessageConverter
在 SpringBoot 中,有许多 HttpMessageConverter 可以将 Request Body 转换为 Java 对象。这些 HttpMessageConverter 接口定义了一种抽象类型转换器,它使用 Spring 的 ObjectMapper 将 Request Body 转换为目标类型(User)。
其中,MappingJackson2HttpMessageConverter
用于处理 JSON 类型的数据,将其转换成 Java 对象。另外,如果 Request Body 中带有其他的数据类型(如XML、HTML等),需要根据数据类型的不同,选择相应的 HttpMessageConverter 进行转换。
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 创建转换器对象
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
// 设置转换器支持的媒体类型
List<MediaType> supportedMediaTypes = new ArrayList<>();
supportedMediaTypes.add(MediaType.APPLICATION_JSON);
converter.setSupportedMediaTypes(supportedMediaTypes);
// 将转换器添加到转换器列表中
converters.add(converter);
}
}
如果不手动配置 HttpMessageConverter 版本,SpringBoot也会自动为我们配置相应的转换器。
示例代码
以下是示例代码:
@RestController
public class UserController {
@PostMapping("/users")
public void saveUsers(@RequestBody List<User> userList) {
System.out.println(userList);
}
}
public class User {
private String name;
private int age;
// setter 和 getter 方法
// ...
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
在前端进行POST请求时,可以按照下面的方式进行请求:
// 假设有两个用户信息需要提交
const users = [{
name: '张三',
age: 20
},
{
name: '李四',
age: 22
}
];
fetch('/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(users)
})
如果数据提交成功,我们将会在控制台上看到以下输出:
[User{name='张三', age=20}, User{name='李四', age=22}]
感谢您的阅读。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解读SpringBoot接收List