无法解决JSON解析错误:因输入结束无内容可映射
解决HttpMessageNotReadableException:JSON请求体无法解析到LoaderInfo的问题
我来帮你排查这个头疼的问题!你遇到的HttpMessageNotReadableException本质上就是JSON请求体和Java实体类LoaderInfo的映射出了问题,结合你贴的代码,我整理了几个关键排查点和解决方案:
1. 先确认JSON格式和字段匹配度
首先,在浏览器控制台打印你发送的JSON内容,看看是不是符合预期:
console.log(JSON.stringify(pageInfo));
要确保:
- 所有键名和LoaderInfo的字段名完全大小写一致(比如
nbrPages不能写成nbrpages) filterValue数组的格式正确,没有语法错误(你写的["blah", "blah"]是对的,但要确保实际场景里没有空数组或者非字符串元素)
2. 把ArrayList改成List,提升兼容性
你的LoaderInfo里filterValue用的是ArrayList<String>,虽然Jackson理论上能处理,但换成更通用的List<String>会更稳妥——Jackson对接口类型的序列化/反序列化支持更友好:
private List<String> filterValue; // 对应的getter/setter也要改成List类型 public List<String> getFilterValue() { return filterValue; } public void setFilterValue(List<String> filterValue) { this.filterValue = filterValue; }
3. 检查Jackson的依赖和配置
如果是传统Spring MVC项目(不是Spring Boot),要确保已经引入Jackson的核心依赖:
<!-- Maven示例 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>你的版本号</version> </dependency>
并且在Spring配置文件里注册MappingJackson2HttpMessageConverter,确保Spring能正确处理JSON请求:
<mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> </mvc:message-converters> </mvc:annotation-driven>
Spring Boot项目默认已经配置好了,这一步可以跳过。
4. 用调试技巧定位具体错误
如果上面的步骤都没解决,建议临时修改控制器方法,先接收原始JSON字符串,手动解析排查问题:
@RequestMapping(value = "/changepage") public String dashboardChangePage(@RequestBody String requestBody, ModelMap model, HttpServletRequest request) { // 打印接收到的JSON,确认内容正确 System.out.println("Received JSON: " + requestBody); ObjectMapper mapper = new ObjectMapper(); try { // 手动解析,看具体哪里出错 LoaderInfo loaderInfo = mapper.readValue(requestBody, LoaderInfo.class); model.addAttribute("loaderInfo", loaderInfo); return dashboardList(model, request); } catch (JsonProcessingException e) { // 这里会输出具体的解析错误,比如哪个字段类型不匹配 e.printStackTrace(); return "error"; // 临时返回错误页 } }
运行后看控制台的异常栈,就能精准定位是哪个字段出了问题(比如某个数字字段传了字符串,或者数组类型不匹配)。
5. 确保无参构造和getter/setter完全正确
你已经写了无参构造,这是Jackson实例化对象的必要条件,但要再检查一遍所有字段的getter/setter:
- 命名必须符合JavaBean规范(比如
getNbrPages()、setNbrPages(Integer nbrPages)) - 不要漏掉任何字段的getter/setter(比如
filterType、sortOrder这些字符串字段)
内容的提问来源于stack exchange,提问作者thedigginman
相关产品推荐
相关产品推荐

