V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NULL2020
V2EX  ›  Java

Spring boot 2.4.1 RestController 返回的 JSON 格式不对

  •  
  •   NULL2020 · 2021-01-19 15:41:43 +08:00 · 2301 次点击
    这是一个创建于 1409 天前的主题,其中的信息可能已经有所发展或是发生改变。

    自定义的返回结构体:

    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 也没看到有相关的说明。

    第 1 条附言  ·  2021-01-19 17:48:20 +08:00

    找到原因了,是因为我在 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() 就正常了

    10 条回复    2021-01-19 18:57:48 +08:00
    chendy
        1
    chendy  
       2021-01-19 16:38:43 +08:00
    目测自定义了序列化之类的,检查一下相关代码吧,默认配置不是这样的
    JamesMackerel
        2
    JamesMackerel  
       2021-01-19 16:43:58 +08:00
    这个看上去像是 Jackson 的 DefaultTyping,Spring 默认使用 Jackson 做序列化和反序列化,建议用这些关键字查一下。
    arthas2234
        3
    arthas2234  
       2021-01-19 16:45:19 +08:00
    我之前也遇到过这个问题
    后面通过 git 对比发现是因为自己注入了 ObjectMapper ( com.fasterxml.jackson.databind.ObjectMapper )类引起的,现在改成通过 new 来创建
    导致问题的根本原因还没找到,现在暂时还没时间排查
    可能是因为自己注入后覆盖了 spring boot 的默认配置
    0x666666
        4
    0x666666  
       2021-01-19 16:45:36 +08:00
    看样子 你这是做了序列化吧?检查你的代码里面有没有统一参数返回配置做了序列化的东西。
    NULL2020
        5
    NULL2020  
    OP
       2021-01-19 16:54:38 +08:00
    @chendy #1
    @JamesMackerel #2
    @arthas2234 #3
    @0x666666 #4

    两个版本都配置了 ObjectMapper bean,配置一样,测试过把 bean 注释掉,效果一样,即旧版本仍然是正常的,新版本仍然是不正常,就很奇怪。
    jorneyr
        6
    jorneyr  
       2021-01-19 17:01:16 +08:00
    从 Spring Boot starter 创建的网址 http://start.spring.io 下载了最小的 web 包,只写一个最简单的 Controller 返回一个普通对象,序列化没问题,应该是你的配置问题。
    NULL2020
        7
    NULL2020  
    OP
       2021-01-19 17:35:10 +08:00
    @jorneyr #6 我也试了下,真是正常的,但我也没配置啥啊。。
    arthas2234
        8
    arthas2234  
       2021-01-19 17:37:47 +08:00
    @NULL2020 八成是配置哪里冲突了,我之前也搞了好久,只能用 git 比较代码,一个一个的排查
    NULL2020
        9
    NULL2020  
    OP
       2021-01-19 17:48:40 +08:00
    @arthas2234 #8 找到原因了,看附言
    arthas2234
        10
    arthas2234  
       2021-01-19 18:57:48 +08:00
    @NULL2020 哈哈,解决了就好。你的问题和我的差不多,也是蛮诡异的,后面我找一下具体的原因
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2813 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:33 · PVG 23:33 · LAX 07:33 · JFK 10:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.