向Spring/Hibernate+Postgres后端POST请求遇Jackson反序列化报错及解决
问题:POST JSON到Java后端触发500错误,无法反序列化实体类
最近遇到个棘手的问题,跟大家分享下我的排查和解决过程:
问题场景
- 我尝试向Java后端接口发送以下JSON请求体:
{ "title": "TITOLO", "description": "DESCRIZIONE", "mediaType": "MEDIATYPE" }
- 数据始终无法写入数据库,但队友用同样的操作完全正常,我在Postman里一直收到500内部服务器错误
- 更奇怪的是:我能成功写入队友的本地数据库,但队友却没法写入我的数据库
- 我的运行环境:MacOS X High Sierra 10.13.4,IDE是Intellij IDEA
错误响应详情
收到的完整错误JSON如下:
{ "timestamp": 1526753419760, "status": 500, "error": "Internal Server Error", "message": "Type definition error: [simple type, class isssr.ticketsystem.entity.Ticket]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `isssr.ticketsystem.entity.Ticket` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator) at [Source: (PushbackInputStream); line: 2, column: 2]", "path": "/ticketsystem/ticket" }
问题根源与解决方案
一开始我以为是实体类Ticket的构造器问题(比如没加无参构造),但队友的代码和我的完全一致,而且队友能正常运行,这就排除了代码本身的问题。
后来对比了我们的运行环境,发现我用的是Java 10,而队友用的是Java 8。尝试把我的JDK降级到Java 8后,所有操作立刻恢复正常,JSON数据能正确写入数据库了。
看来是项目依赖的Jackson版本和Java 10存在兼容性问题,导致无法正确反序列化实体类。
内容的提问来源于stack exchange,提问作者JackLametta
相关产品推荐
相关产品推荐

