Spring Boot中Jackson多态反序列化报错:JSON输入意外结束
我遇到过类似的问题,结合你的场景来看,这个EOF(Unexpected end-of-input)错误通常指向JSON请求体不完整或者格式有问题,但你本地用ObjectMapper测试正常,说明代码本身的Jackson配置是没问题的,问题大概率出在Postman的请求发送环节或者Spring接收请求的配置上。下面给你分析几个可能的原因和对应的解决方案:
1. Postman发送的JSON存在隐蔽格式错误
你贴出来的JSON看起来是合法的,但实际发送时可能存在以下问题:
- 不小心添加了多余的逗号(比如数组最后一个元素后面的逗号),虽然有些JSON解析器容忍这个,但Jackson在严格模式下会报错;
- 请求体被意外截断(比如Postman在发送时出现了网络问题,导致部分JSON没传过去);
- 存在不可见的特殊字符(比如换行符、空格的编码问题)。
解决方法:
- 把你在Postman里的请求体复制到在线JSON校验工具里检查合法性;
- 直接复制本地测试用的那个JSON字符串到Postman里发送,确保和测试用的完全一致。
2. Postman的请求头配置错误
Spring MVC只有在请求头Content-Type设置为application/json时,才会用Jackson来解析请求体。如果这个头没设置或者设置错了(比如设成了text/plain),Spring会把请求体当成普通文本处理,进而导致解析错误。
解决方法:
在Postman的请求头里添加Content-Type: application/json,确保这个头存在且正确。
3. Spring Boot中的ObjectMapper配置和本地测试不一致
你本地用的是默认的ObjectMapper,但Spring Boot可能通过自动配置或者自定义配置修改了Jackson的行为。比如某些全局配置开启了严格的解析模式,或者禁用了某些特性。
解决方法:
在你的Spring Boot项目中注入ObjectMapper,打印它的配置参数,和本地测试的ObjectMapper对比:
@Autowired private ObjectMapper objectMapper; // 在某个方法里打印配置 public void printMapperConfig() { System.out.println("FAIL_ON_UNKNOWN_PROPERTIES: " + objectMapper.isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)); System.out.println("ACCEPT_SINGLE_VALUE_AS_ARRAY: " + objectMapper.isEnabled(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY)); // 可以打印更多相关配置 }
如果发现差异,调整Spring的Jackson配置,或者在代码中显式设置需要的特性。
4. 尝试用其他工具验证请求
为了排除Postman本身的问题,你可以用curl命令来发送相同的请求:
curl -X POST \ http://localhost:8080/organizations \ -H 'Content-Type: application/json' \ -d '{ "name": "My Organization", "employees": [ { "type": "full", "name": "Vinit Solanki", "salary": 200 }, { "type": "full", "name": "Viren Shah", "salary": 300 } ] }'
如果curl能成功,那问题肯定出在Postman的设置上;如果curl也报错,那需要检查Spring的接收逻辑或者服务器的网络配置。
5. 开启Spring的DEBUG日志排查细节
开启Spring Web的DEBUG级别日志,能看到服务器实际接收的请求体内容,这样就能确认是否是请求体本身的问题。
在application.properties中添加:
logging.level.org.springframework.web=DEBUG
发送请求后,查看日志中关于请求体的打印内容,就能知道服务器收到的JSON是否完整、格式是否正确。
内容的提问来源于stack exchange,提问作者Vinit Solanki

