自定义的返回结构体:
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 哈哈,解决了就好。你的问题和我的差不多,也是蛮诡异的,后面我找一下具体的原因
|