
自定义的返回结构体:
public class JsonResult<T> { private int code; private String message; private T data; } 之前使用 Springboot 2.1.4,接口返回的格式为
{ "code": 200, "message": "操作成功", "data": null } 最近考虑升级下版本,测试 Springboot 2.4.1,返回格式为:
[ "com.xxx.support.JsonResult", { "code": 200, "message": "操作成功", "data": [ "java.util.ArrayList", [] ] } ] 是要修改什么配置吗?看 release note 也没看到有相关的说明。
找到原因了,是因为我在 redis 的配置类里使用了自动注入的 objectMapper bean,然后在里面设置了一个属性:
private RedisSerializer<Object> valueSerializer() { Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class); //ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY) .enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); serializer.setObjectMapper(objectMapper); return serializer; } 在这里面改成 new ObjectMapper() 就正常了
1 chendy 2021-01-19 16:38:43 +08:00 目测自定义了序列化之类的,检查一下相关代码吧,默认配置不是这样的 |
2 JamesMackerel 2021-01-19 16:43:58 +08:00 这个看上去像是 Jackson 的 DefaultTyping,Spring 默认使用 Jackson 做序列化和反序列化,建议用这些关键字查一下。 |
3 arthas2234 2021-01-19 16:45:19 +08:00 我之前也遇到过这个问题 后面通过 git 对比发现是因为自己注入了 ObjectMapper ( com.fasterxml.jackson.databind.ObjectMapper )类引起的,现在改成通过 new 来创建 导致问题的根本原因还没找到,现在暂时还没时间排查 可能是因为自己注入后覆盖了 spring boot 的默认配置 |
4 0x666666 2021-01-19 16:45:36 +08:00 看样子 你这是做了序列化吧?检查你的代码里面有没有统一参数返回配置做了序列化的东西。 |
5 NULL2020 OP @chendy #1 @JamesMackerel #2 @arthas2234 #3 @0x666666 #4 两个版本都配置了 ObjectMapper bean,配置一样,测试过把 bean 注释掉,效果一样,即旧版本仍然是正常的,新版本仍然是不正常,就很奇怪。 |
6 jorneyr 2021-01-19 17:01:16 +08:00 从 Spring Boot starter 创建的网址 http://start.spring.io 下载了最小的 web 包,只写一个最简单的 Controller 返回一个普通对象,序列化没问题,应该是你的配置问题。 |
8 arthas2234 2021-01-19 17:37:47 +08:00 @NULL2020 八成是配置哪里冲突了,我之前也搞了好久,只能用 git 比较代码,一个一个的排查 |
9 NULL2020 OP @arthas2234 #8 找到原因了,看附言 |
10 arthas2234 2021-01-19 18:57:48 +08:00 @NULL2020 哈哈,解决了就好。你的问题和我的差不多,也是蛮诡异的,后面我找一下具体的原因 |