SpringBoot POST接口String反序列化失败及JPA参数不匹配问题咨询
问题原因与解决方案
初始反序列化报错原因
你遇到的Could not read document: Can not deserialize instance of java.lang.String out of START_OBJECT token报错,核心原因是参数类型不匹配:
- 你的Controller接口定义了
@RequestBody String cifNif,要求接收一个字符串类型的请求体 - 你在Postman中传入的是JSON对象格式的请求体
{"cifNif": "E85882355"},JSON对象开头的{对应Jackson反序列化的START_OBJECT标记,无法直接被反序列化为String类型,因此抛出异常。
对应解决方案(二选一即可)
- 调整入参接收逻辑(推荐):用实体类或Map接收JSON对象参数,取出属性后再调用后续逻辑
// 用现有Contrato实体类接收JSON参数 @PostMapping(value = "/recuperaNombreLegalCliente") public String recuperaNombreLegalCliente(@RequestBody Contrato contrato) { // 取出cifNif属性传入service,不要直接传整个实体对象 return contratoService.getNombreLegalCliente(contrato.getCifNif()); }
- 调整Postman传参格式:请求体直接传入纯字符串,Content-Type改为
text/plain,不需要套JSON结构
E85882355
修改后新报错原因
你修改代码后出现的类型不匹配报错,是因为你直接把接收到的Contrato实体对象传入了Repository的getNombreLegalCliente方法:
- Repository的方法要求入参是
String类型的cifNif值 - 你传入的是整个Contrato实体对象,Hibernate执行查询时发现参数类型和预期的String不匹配,因此抛出
Parameter value [Contrato [...]] did not match expected type [java.lang.String]异常。
对应解决方案
调用service层方法时,传入Contrato实体的cifNif属性值即可,参考上面第一种解决方案的代码示例即可。
内容的提问来源于stack exchange,提问作者okjfokjrf
相关产品推荐
相关产品推荐

