V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
NULL2020
V2EX  ›  Java

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

  •  
  •   NULL2020 · Jan 19, 2021 · 2842 views
    This topic created in 1927 days ago, the information mentioned may be changed or developed.

    自定义的返回结构体:

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

    Supplement 1  ·  Jan 19, 2021

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

    两个版本都配置了 ObjectMapper bean,配置一样,测试过把 bean 注释掉,效果一样,即旧版本仍然是正常的,新版本仍然是不正常,就很奇怪。
    jorneyr
        6
    jorneyr  
       Jan 19, 2021
    从 Spring Boot starter 创建的网址 http://start.spring.io 下载了最小的 web 包,只写一个最简单的 Controller 返回一个普通对象,序列化没问题,应该是你的配置问题。
    NULL2020
        7
    NULL2020  
    OP
       Jan 19, 2021
    @jorneyr #6 我也试了下,真是正常的,但我也没配置啥啊。。
    arthas2234
        8
    arthas2234  
       Jan 19, 2021
    @NULL2020 八成是配置哪里冲突了,我之前也搞了好久,只能用 git 比较代码,一个一个的排查
    NULL2020
        9
    NULL2020  
    OP
       Jan 19, 2021
    @arthas2234 #8 找到原因了,看附言
    arthas2234
        10
    arthas2234  
       Jan 19, 2021
    @NULL2020 哈哈,解决了就好。你的问题和我的差不多,也是蛮诡异的,后面我找一下具体的原因
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2730 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 59ms · UTC 14:28 · PVG 22:28 · LAX 07:28 · JFK 10:28
    ♥ Do have faith in what you're doing.