如何在RestTemplate的POST请求中传递List<Users>作为请求体
解决RestTemplate发送List作为请求体的POST请求问题
首先先补全你可能遗漏的关键细节:你的Users类需要添加无参构造器、getter和setter方法,因为Spring的JSON序列化工具(Jackson)依赖这些来处理对象和JSON的转换。很多人踩坑就是忽略了这一步!修改后的Users类应该是这样:
public class Users { private String id; private String name; private String gender; // 无参构造器(必须,Jackson序列化需要) public Users() {} // 带参构造器(可选,方便快速初始化对象) public Users(String id, String name, String gender) { this.id = id; this.name = name; this.gender = gender; } // getter和setter方法(必须,Jackson序列化/反序列化需要) public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } }
接下来就是正确发送POST请求的完整步骤:
1. 确保RestTemplate配置正确
如果是Spring Boot项目,默认的RestTemplate已经集成了MappingJackson2HttpMessageConverter,可以直接处理JSON的序列化/反序列化。如果是手动创建RestTemplate,也可以手动添加这个转换器(避免出现无法序列化List的问题):
RestTemplate restTemplate = new RestTemplate(); restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
2. 构造完整的请求实体(HttpEntity)
把你已经初始化好的userList和请求头headers包装成HttpEntity,这就是RestTemplate要发送的完整请求内容:
// 补全请求头的ContentType设置 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); // 把用户列表和请求头打包成请求实体 HttpEntity<List<Users>> requestEntity = new HttpEntity<>(userList, headers);
3. 发送POST请求
根据你的需求选择postForObject(直接返回响应对象)或者postForEntity(返回包含响应头、状态码的完整响应实体):
示例1:用postForObject直接获取响应结果
假设目标API的响应是某个自定义的BatchResponse类:
String targetApiUrl = "https://your-api-domain.com/users/batch-save"; BatchResponse response = restTemplate.postForObject(targetApiUrl, requestEntity, BatchResponse.class);
示例2:用postForEntity获取完整响应信息
如果需要获取响应状态码、响应头等额外信息,可以用这个:
String targetApiUrl = "https://your-api-domain.com/users/batch-save"; ResponseEntity<BatchResponse> responseEntity = restTemplate.postForEntity(targetApiUrl, requestEntity, BatchResponse.class); // 可以获取状态码、响应体等信息 HttpStatus statusCode = responseEntity.getStatusCode(); BatchResponse responseBody = responseEntity.getBody();
额外提醒
- 如果目标API要求的是表单数据而非JSON,那需要把请求头改成
MediaType.APPLICATION_FORM_URLENCODED,但根据你的描述,用APPLICATION_JSON就完全匹配需求。 - 如果遇到序列化失败的报错,优先检查Users类的构造器、getter/setter是否齐全,或者有没有字段被
transient修饰(会被Jackson忽略)。
内容的提问来源于stack exchange,提问作者Jayendran
相关产品推荐
相关产品推荐

