关于jackson序列化和feign返回值的问题

目录
  • jackson序列化和feign返回值
    • jackson注意点
    • feignClient返回值问题
  • feign调用异常,反序列化失败
    • 异常消息如下

jackson序列化和feign返回值

jackson注意点

被序列化/反序列化的实体

a.必须要有无参构造方法

b.字段要有set/get方法

c.不需要序列化的字段 可以用@jsonIgnore 修饰

feignClient 返回值问题

返回值的类型 不一定 和被调用方返回值类型一样

如:

被调用方是

@ResponseBody
@RequestMapping("test");
public Map test(){
    Map map = new HashMap();
    map.put("name","zhangsan");
    map.put("address","地址");
    return map;
}

调用方:

@FeignClient("xxxx")
public Interface xxService{
    @RequestMapping("/test")
    Test test();
}
/**
* 实体类对应的属性 和 map中对应 就行了
*/
@Data
class Test{
    public Test(){}
    private String name;
    private String address;
}

还有个方法就是 调用方直接用string 接收 再自己转换

feign调用异常,反序列化失败

异常消息如下

nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `xxx` out of START_OBJECT token

本来我用fastjson消息转换器替换了原来的消息转换器,我以为是没有替换掉,折腾了一阵

后来去掉fastjson消息转换器还是报错,我想着应该是返回的数据问题

被调用服务控制层返回的数据和我反序列的对象一致,应该是被调用服务对返回的数据统一做了包装,导致的问题,去除包装就好了,或者反序列化的对象为包装后的对象

我是在方法映射上加headers属性,属性值Keep-Original=Keep-Original,去除包装

@GetMapping(value = "xxx",headers = {"Keep-Original=Keep-Original"})

最后问题就完美解决了

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • jackson序列化和反序列化的应用实践指南

    源码地址:https://github.com/zhouweixin/serializable 1 相关概念 序列化: 把对象转换为字节序列的过程称为对象的序列化 反序列化: 把字节序列恢复为对象的过程称为对象的反序列化 2 序列化的作用 用于把内存中的对象状态保存到一个文件中或者数据库中 用于网络传送对象 用于远程调用传输对象 3 准备序列化对象 准备了两个类, 教师类和学生类, 其中一个学生只有一个教师 这里省略了构造方法和setter, getter方法 Teacher.java publ

  • Jackson序列化和反序列化忽略字段操作

    一.设置Jackson序列化时只包含不为空的字段 new ObjectMapper().setSerializationInclusion(Include.NON_NULL); 二.设置在反序列化时忽略在JSON字符串中存在,而在Java中不存在的属性 new ObjectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); 三.Jackson序列化时忽略字段的方式 1.方式一:FilterProvider a)在需

  • 使用Jackson反序列化遇到的问题及解决

    Jackson反序列化遇到的问题 最近在项目中需要使用Jackson把前台转来的字符转为对象,转换过程中发生了错误,报错如下 ​com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not construct instance of java.util.Date from String value '2018-09-14 15:12:08': not a valid representation (error: Failed

  • 解决Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题

    LocalDate . LocalTime . LocalDateTime 是Java 8开始提供的时间日期API,主要用来优化Java 8以前对于时间日期的处理操作.然而,我们在使用Spring Boot或使用Spring Cloud Feign的时候,往往会发现使用请求参数或返回结果中有 LocalDate . LocalTime . LocalDateTime 的时候会发生各种问题.本文我们就来说说这种情况下出现的问题,以及如何解决. 问题现象 先来看看症状.比如下面的例子: @Sprin

  • 关于jackson序列化和feign返回值的问题

    目录 jackson序列化和feign返回值 jackson注意点 feignClient返回值问题 feign调用异常,反序列化失败 异常消息如下 jackson序列化和feign返回值 jackson注意点 被序列化/反序列化的实体 a.必须要有无参构造方法 b.字段要有set/get方法 c.不需要序列化的字段 可以用@jsonIgnore 修饰 feignClient 返回值问题 返回值的类型 不一定 和被调用方返回值类型一样 如: 被调用方是 @ResponseBody @Reques

  • Feign接口方法返回值设置方式

    一.介绍 随着微服务的广泛应用,越来越多的企业都会使用微服务进行项目开发,在各个服务之间需要通过feign来进行通信,所以在feign调用接口中方法会接受其他服务接口不同类型返回值. 二.返回值设置 1.依据被调用服务接口设置相同返回类型 介绍:微服务A接口getUser 返回List<User>类型,微服务B通过feign调用方法也返回相同的结果类型. 特点:返回类型一一对应,在调用时不需要进行转化直接拿来就可以用. 缺点:扩展性不好,维护性不加. 解释:在目前springboot开发中,接

  • spring boot 下对JSON返回值去除null和空字段操作

    在开发过程中,我们需要统一返回前端json格式的数据,但有些接口的返回值存在 null或者""这种没有意义的字段. 不仅影响理解,还浪费带宽,这时我们可以统一做一下处理,不返回空字段,或者把NULL转成"",spring 内置的json处理框架是Jackson.我们可以对它配置一下达到目的 直接看代码,很简单. /** * 〈返回json空值去掉null和""〉 〈功能详细描述〉 * * @author gogym * @version 2017

  • SpringBoot ResponseBody返回值处理的实现

    1. SpringBoot ResponseBody 返回值中null值处理 @PostMapping(path = "/test", produces = MediaType.APPLICATION_JSON_VALUE) public Object test() { JSONObject jsonObject = new JSONObject(); jsonObject.put("test","test"); jsonObject.put(&

  • Jackson序列化丢失泛型的解决

    Jackson序列化丢失泛型 经过 项目中遇到一个奇怪的bug,即一个Map<Integer,List<Integer>>的泛型map,向map中get一个存在的key,事实上却返回null. 经过排查,发现是该map被Jackson序列化后,key的类型从Integer变成了String类型.再经过反序列化,即使已经声明key泛型的Integer,反序列化后内存数据中的key为String并不是Integer类型且并未抛出异常. 复现 1.声明一个key泛型为Integer的ma

  • 如何自定义Jackson序列化 @JsonSerialize

    目录 自定义Jackson序列化 @JsonSerialize jackson自定义全局序列化.反序列化 创建序列化类 创建反序列化类 将两个类注册进入jackson核心对象objectMapper 小结一下 自定义Jackson序列化 @JsonSerialize 自定义json序列化需要实现StdSerializer<T>或者JsonSerializer<T>. 我要序列化House这个类,加上注解,指定用于序列化的类 package com.xhx.json.entity;

  • SpringMVC Controller 返回值的可选类型详解

    spring mvc 支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void. ModelAndView @RequestMapping("/hello") public ModelAndView helloWorld() { String message = "Hello World, Spring 3.x!"; return new ModelAndView("hello"

  • SpringMVC 方法四种类型返回值总结(你用过几种)

    SpringMVC 现在算是 Java 领域的一个基础性框架了,很多人天天用,可是对于 SpringMVC 方法的返回值,你又是否完全清楚呢?今天松哥就来和大家聊一聊 SpringMVC 中四种不同类型的返回值,看看有没有 get 到你的知识盲点? 1. ModelAndView 以前前后端不分的情况下,ModelAndView 应该是最最常见的返回值类型了,现在前后端分离后,后端都是以返回 JSON 数据为主了.后端返回 ModelAndView 这个比较容易理解,开发者可以在 ModelAn

  • Spring MVC Controller返回值及异常的统一处理方法

    旧的设计方案 开发api的时候,需要先定义好接口的数据响应结果.如下是一个很简单直接的Controller实现方法及响应结果定义. @RestController @RequestMapping("/users") public class UserController { @Inject private UserService userService; @GetRequest("/{userId:\\d+}") public ResponseBean signin

随机推荐