Spring Framework中如何处理并保存ESP8266发送的JSON数组?
解决Spring接收JSON数组并批量保存ESP8266监测数据的问题
你遇到的错误原因很明确:发送的请求体是JSON数组,但Controller方法的@RequestBody参数声明为单个DataModel对象,Jackson无法将数组反序列化成单个对象,因此抛出HttpMessageNotReadableException。要实现将数组中每个元素作为独立对象保存,只需修改以下几处代码:
1. 修改Controller,接收List
将Controller的请求参数改为List<DataModel>,直接接收整个JSON数组:
@PostMapping("/addData") public ResponseEntity addData(@RequestBody List<DataModel> dataModels){ try { dataServicez.saveBatchData(dataModels); return ResponseEntity.ok("批量保存成功"); } catch (Exception e){ return ResponseEntity.badRequest().body("保存失败:" + e.getMessage()); } }
2. 新增批量保存的Service方法
利用JPA自带的批量保存方法saveAll(前提是你的dataRepo继承了JpaRepository),替代循环单个保存,提升效率:
public List<DataModel> saveBatchData(List<DataModel> dataModels){ // ID是自增字段,无需手动赋值,直接传入列表即可 return dataRepo.saveAll(dataModels); }
注:如果你的业务需要对每个DataModel做额外处理,可以遍历列表逐个创建对象,但通常Jackson已经完成了JSON到对象的反序列化,直接保存即可。
3. 关键注意事项
- 确保
DataModel类存在无参构造方法,Jackson反序列化必须依赖它 - ESP8266发送的整数值会被Jackson自动转换为
Double类型,无需额外处理 - 批量保存相比循环单个保存,能大幅降低数据库交互次数,更适合高频数据场景
内容的提问来源于stack exchange,提问作者PluggaRose
相关产品推荐
相关产品推荐

