博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记一次序列化的JSON解析问题
阅读量:5154 次
发布时间:2019-06-13

本文共 2026 字,大约阅读时间需要 6 分钟。

目录

一、问题初探

我今天在使用Ribbon 远程调用的时候

消费者去消费服务端所提供的服务,在使用Post请求中的PostForEntity传递参数的时候,我是这样写的

Ribbon 消费端:

1515111-20190529153735195-643289776.png

User 是一个 Pojo 对象,代码如下:

public class User {    private Integer id;    private String name;    public User(Integer id, String name) {        this.id = id;        this.name = name;    }    get... and set ...}

Ribbon 服务端:

1515111-20190529153522586-2027612831.png

就是一个很简单的Ribbon 远程调用的一个操作,报如下错误:

1515111-20190529153536382-363918546.png

跟入源码:

1515111-20190529153554430-2076615010.png

1515111-20190529153602587-960545191.png

然后就不明觉厉了,第一开始比较烦躁,一直以为是消费端的问题,因为错误是从消费服务端报出来的。后来经过冷静发现,上述代码是在处理服务端响应的时候报出来的,应该还是服务端报错来的错误。

2019-04-14 13:56:27.183  WARN 3500 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Can not construct instance of com.service.provider.pojo.User: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of com.service.provider.pojo.User: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?) at [Source: java.io.PushbackInputStream@25979c35; line: 1, column: 2]

代码并不能看懂什么意思,求助google,从stackoverflow上找到了问题的答案:

1515111-20190529153617778-1285062230.png

没有加默认的构造函数?????? 这是什么鬼? 默认的构造函数和JSON解析有什么关系?

但是能够解决问题了,我检查了一遍我一直以为我的值没有传递过去,但我看已经传递到服务端了(避免了一个白痴问题)。

二、问题原因

====================================华丽的分割线====================================

事实印证了我是个菜比。

事情是这样的

Ribbon的消费者向服务者提供的数据转换是要把对象转换为二进制数据,这个过程称之为序列化

而服务端收到二进制的数据再转换为对应的对象,这个过程称之为反序列化

序列化会把对象保存在磁盘中,或允许直接在网络中直接传输对象

反序列化就是收到二进制的数据,再转换为对应的对象。

而实现对象序列化的方法有两种:

1. 实现序列化接口

2. 提供无参构造函数

而上面报错的原因就是因为没有提供默认的构造函数或者实现序列化接口!!!!!

三、解决问题

添加无参构造函数

解决问题一,再上面的Pojo类上添加默认的构造函数

public class User {    private Integer id;    private String name;    public User(){}    public User(Integer id, String name) {        this.id = id;        this.name = name;    }    get and set...}

再次调用接口,客户端能够打印出来对应的日志

1515111-20190529153743981-1077653903.png

转载于:https://www.cnblogs.com/cxuanBlog/p/10944164.html

你可能感兴趣的文章
35. Search Insert Position(C++)
查看>>
[毕业生的商业软件开发之路]C#异常处理
查看>>
一些php文件函数
查看>>
有关快速幂取模
查看>>
Linux运维必备工具
查看>>
字符串的查找删除
查看>>
NOI2018垫底记
查看>>
快速切题 poj 1002 487-3279 按规则处理 模拟 难度:0
查看>>
Codeforces Round #277 (Div. 2)
查看>>
【更新】智能手机批量添加联系人
查看>>
NYOJ-128前缀式计算
查看>>
淡定,啊。数据唯一性
查看>>
深入理解 JavaScript 事件循环(一)— event loop
查看>>
Hive(7)-基本查询语句
查看>>
注意java的对象引用
查看>>
C++ 面向对象 类成员函数this指针
查看>>
NSPredicate的使用,超级强大
查看>>
自动分割mp3等音频视频文件的脚本
查看>>
判断字符串是否为空的注意事项
查看>>
布兰诗歌
查看>>