Spring JSON反序列化报错:Map类型无法从数组值反序列化
问题分析与解决方案
核心问题
你遇到的第二个反序列化错误,根源是请求体中dimensions字段的JSON格式与Product实体类的类型不匹配:
- 实体类里
dimensions定义为Map<String, Double>,对应JSON应该是一个键值对对象 - 但你的请求体里
dimensions写成了数组包裹对象的格式,Jackson无法将数组反序列化为Map
另外还有两个次要问题:
- 请求体中
pricePerUnit是字符串类型(带引号),但实体类是float,虽然Jackson能自动转换,但建议统一为数字格式 - 服务层批量插入用循环
save效率较低,推荐用saveAll
具体修复步骤
1. 修正Postman请求体格式
把dimensions的数组格式改成直接的键值对对象,同时去掉pricePerUnit的引号:
{ "products": [ { "productCode": "P100", "name": "produit 1", "pricePerUnit": 250.99, "dimensions": { "productHeight": 55, "productWeight": 20 } }, { "productCode": "P101", "name": "produit 2", "pricePerUnit": 250.99, "dimensions": { "productHeight": 60, "productWeight": 15 } } ] }
2. 优化服务层批量插入逻辑
将循环单个save改为批量saveAll,提升性能:
public class ProductServiceImpl implements ProductService { private final ProductRepository productRepository; public ProductServiceImpl(ProductRepository productRepository) { this.productRepository = productRepository; } @Override public void addProducts(List<Product> products) { productRepository.saveAll(products); } }
3. 验证实体类注解(可选)
确保@Type(type="jsonb")和JsonBinaryType配置正确,保证Map能正确序列化为PostgreSQL的jsonb类型,这部分你当前的代码是没问题的,但如果后续仍有存储问题,可以检查依赖是否引入了hibernate-types-52(或对应版本)。
为什么第一个错误会解决?
最初的错误是因为你直接用ArrayList<Product>接收请求体,但请求体是一个包含products字段的对象,而不是纯数组。创建ProductWrapper类后,请求体的结构与接收类匹配,所以这个问题自然解决。
内容的提问来源于stack exchange,提问作者Ing Dev
相关产品推荐
相关产品推荐

