一、问题初探

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

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

Ribbon 消费端:

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 服务端:

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

跟入源码:

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

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上找到了问题的答案:

没有加默认的构造函数?????? 这是什么鬼? 默认的构造函数和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...
}

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

记一次序列化的JSON解析问题的更多相关文章

  1. Java下利用Jackson进行JSON解析和序列化

    Java下利用Jackson进行JSON解析和序列化   Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行 ...

  2. JSON解析与序列化

    JSON之所以流行,拥有与JavaScript类似的语法并不是全部原因.更重要的一个原因是,可以把JSON数据结构解析为有用的 JavaScript对象.与XML数据结构要解析成DOM文档而且从中提取 ...

  3. SpringBoot 默认json解析器详解和字段序列化自定义

    前言 在我们开发项目API接口的时候,一些没有数据的字段会默认返回NULL,数字类型也会是NULL,这个时候前端希望字符串能够统一返回空字符,数字默认返回0,那我们就需要自定义json序列化处理 Sp ...

  4. Json解析工具Jackson(使用注解)

    原文http://blog.csdn.net/nomousewch/article/details/8955796 接上一篇文章Json解析工具Jackson(简单应用),jackson在实际应用中给 ...

  5. Tomjson - 一个"短小精悍"的 json 解析库

    Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把Java对象(JavaBean)序列化为json格式字符串,将json格式字符 ...

  6. 一个.NET通用JSON解析/构建类的实现(c#)转

    转自:http://www.cnblogs.com/xfrog/archive/2010/04/07/1706754.html NET通用JSON解析/构建类的实现(c#) 在.NET Framewo ...

  7. fastjson是阿里巴巴的开源JSON解析库

    fastjson的API十分简洁. String text = JSON.toJSONString(obj); //序列化 VO vo = JSON.parseObject("{...}&q ...

  8. Javascript调用C#后台方法及JSon解析

    Javascript调用C#后台方法及JSon解析   如何使用Ajax 调用C# 后台方法. 本文目录 如何使用Ajax 调用C# 后台方法. 1.后台(.cs)测试方法 2.前台调用(javasc ...

  9. json解析jackson ,Gson,等知识总结

    相关资料链接: Java构造和解析json数据的两种方法详解 java解析json Android网络之数据分析---使用Google Gson 解析Json数据 使用jackson在java中处理j ...

随机推荐

  1. 【转】js中select的基本操作

    判断select选项中 是否存在Value="paraValue"的Item  // 1.判断select选项中 是否存在Value="paraValue"的I ...

  2. 加载某个页面(A)时实现自动跳转到某个页面(B)

    <head> <title></title> <script type="text/javascript"> function fu ...

  3. SVD实例

    >> X = rand(5,7) X = 0.9797 0.1365 0.6614 0.5828 0.2259 0.2091 0.5678 0.2714 0.0118 0.2844 0.4 ...

  4. CentOS7下源码安装5.6.23

    清理CentOS7下的MariaDB. [root@localhost ~]#rpm -qa | gremp mariadb     [root@localhost ~]# rpm -e --node ...

  5. 树莓派 Learning 002 装机后的必要操作 --- 02 解决中文问题

    树莓派 装机后的必要操作 - 解决中文问题 我的树莓派型号:Raspberry Pi 2 Model B V1.1 装机系统:NOOBS v1.9.2 每一块树莓派,装机后都应该执行的步骤 刚装机后, ...

  6. 《精通Spring4.X企业应用开发实战》读后感第五章(不同配置方式比较)

  7. [转]hadoop运行mapreduce作业无法连接0.0.0.0/0.0.0.0:10020

    14/04/04 17:15:12 INFO mapreduce.Job:  map 0% reduce 0% 14/04/04 17:19:42 INFO mapreduce.Job:  map 4 ...

  8. Entity Framework Code-First(11):Configure One-to-One

    Configure One-to-Zero-or-One Relationship: Here, we will configure One-to-Zero-or-One relationship b ...

  9. Elasticsearch集群使用ik分词器

    IK分词插件的安装 ES集群环境 VMWare下三台虚拟机Ubuntu 14.04.2 LTS JDK 1.8.0_66 Elasticsearch 2.3.1 elasticsearch-jdbc- ...

  10. ProtoBuf练习(四)

    其中一个类型 protobuf语言的oneof字段类型相当于C++语言的联合数据类型 工程目录结构 $ ls proto/ sample_oneof.proto proto文件 $ cat proto ...