一、问题初探

我今天在使用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. 【转】 Pro Android学习笔记(七一):HTTP服务(5):多线程调用HttpClient

    目录(?)[-] 应用共享HttpClient对象的同步问题 创建共享HttpClient代码 创建共享对象 创建可共享的HttpClient对象 使用共享HttpClient对象的代码 基础代码 修 ...

  2. Otter入门简介

    一.Otter简介 1.1  otter是什么? otter 译意: 水獭,数据搬运工 语言: 纯java开发 定位: 基于数据库增量日志解析,准实时同步到本机房或异地机房的mysql/oracle数 ...

  3. oracle--基础查询(1)

    --查询所有列语句 select * from emp; ---查询指定列表的查询语句 select empno,ename,sal from emp; --带有简单算术运算符的简单查询 select ...

  4. ng2 样式控制之style绑定和class绑定

  5. IoC概述

    ---------------siwuxie095 IoC,即 Inversion of Control,控制反转,它是 Spring 容器的内核 AOP.声明式事务等功能都是在此基础上开花结果,即 ...

  6. Google浏览器插件

    Scholarscope XPath Helper Web Scraper JSON-handle  User-Agent Swicher  Markdown Here

  7. 积累遇到过的linux终端操作指令

    mkdir mkdir命令是常用的命令,用来建立空目录,它还有2个常用参数: -m, --mode=模式 设定权限<模式> (类似 chmod) -p, --parents 需要时创建上层 ...

  8. JAVA之J2EE学习路线

    摘自:http://blog.csdn.net/hsc456/article/details/51970559   历经2,3个月,终于学完了J2EE的方方面面,虽然还是一知半解,好歹也算是整条路都走 ...

  9. hibernate查询的方式和变量

    1.实体查询: hql="FROM User"; List list= session.createQuery(hql).list(); for(Object obj:list){ ...

  10. C# Newtonsoft.Json不序列字段

    [JsonObject(MemberSerialization.OptOut)] public class employeePersonalForm { [JsonIgnore] public str ...