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

RestTemplate 映射复杂对象的最佳实践是?

  •  
  •   uSy62nMkdH · 2022-08-08 15:33:48 +08:00 · 2902 次点击
    这是一个创建于 872 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如下面这个算是很常见的了

    {
        "code":200,
        "msg":"success",
        "data":[
            {
                "id":1,
                "name":"jack"
            },
            {
                "id":2,
                "name":"rose"
            }
        ]
    }
    

    按照resttemplate map response to pojo关键字搜了半天居然没找到合适的方案

    • 有自己封装 resttemplate util 然后用 fastjson jackson 解析的
    • 有用 exchange 方法自定义 reference 解析的
    • 有直接 string 然后硬解的

    现在就想知道,针对这种返回体,使用 postEntity 或者 postObject 方法,resttemplate 有没有一些更优雅的处理方式?

    17 条回复    2024-09-02 10:44:52 +08:00
    chendy
        1
    chendy  
       2022-08-08 15:41:59 +08:00
    个人经验
    1. RestTemplate 拿 String
    2. 自己做转换,这样如果遇到解析出错的情况,可以把原始 json 字符串打日志出来,方便排查

    因为 RestTemplate 默认是用 Content-Type 判断如何反序列化,如果遇到(经常遇到) Content-Type 不好好给的接口,就要重新配置 MessageConverter ,就更麻烦
    自己做转换可以自己封装 Response<T> -> UserResponse extends Response<User> 这样的类型,或者用 json 库相关的机制转换也可以
    uSy62nMkdH
        2
    uSy62nMkdH  
    OP
       2022-08-08 15:49:59 +08:00
    @chendy
    fastjson 的 MessageConverter 支持的 Content-Type 是 ALL 哈哈
    我现在已经准备拿 string 一把梭了😭
    LeegoYih
        3
    LeegoYih  
       2022-08-08 15:50:28 +08:00   ❤️ 1
    可以试试用 OpenFeign ,通过方法方式调用

    wolfie
        4
    wolfie  
       2022-08-08 15:57:27 +08:00
    org.springframework.web.client.RestTemplate#exchange

    exchange 不是可以指定 ResponseEntity 泛型。
    damai0419
        5
    damai0419  
       2022-08-08 16:04:22 +08:00
    直接 postEntity/Object 的没有,只有 exchange 的有,不过封装一层也不麻烦。

    public <T> ResponseEntity<T> exchange(String url, HttpMethod method, @Nullable HttpEntity<?> requestEntity, ParameterizedTypeReference<T> responseType, Object... uriVariables)

    ParameterizedTypeReference<T> responseType 这个字段是用来指定返回值的,支持了泛型嵌套能力。
    mosliu
        6
    mosliu  
       2022-08-08 16:15:07 +08:00
    @chendy 非常同意。。 因为我就是这么做的。 使用 jackson 或 gson 转换,调试也方便。
    lazyfighter
        7
    lazyfighter  
       2022-08-08 16:41:24 +08:00
    我都是自己封装 httpUtil
    nekoneko
        8
    nekoneko  
       2022-08-08 17:08:38 +08:00
    ParameterizedTypeReference<List<String>> ptr = new ParameterizedTypeReference<List<String>>() {};
    ResponseEntity<List<String>> res = restTemplateBuilder.build()
    .exchange(uriTemplate, HttpMethod.GET, null, ptr);

    这样可以
    zhangxzh
        9
    zhangxzh  
       2022-08-08 18:12:27 +08:00 via Android
    这东西为什么单独拿出来用
    RedBeanIce
        10
    RedBeanIce  
       2022-08-08 21:29:31 +08:00
    @LeegoYih springboot 项目直接引入 openfeign 嘛,,,好像挺不错的诶。。
    Leviathann
        11
    Leviathann  
       2022-08-08 21:37:14 +08:00
    这破玩意的 api 突出一个乱七八糟
    zhangxzh
        12
    zhangxzh  
       2022-08-09 00:58:42 +08:00 via Android   ❤️ 1
    @RedBeanIce 单独的 feign 应对简单客户端就足够了,openfeign 的间接依赖太重而且即使新版好像还挂着 cve 的牌子。同时欢迎换用 reative 和 WebClient
    xiangyuecn
        13
    xiangyuecn  
       2022-08-09 01:26:02 +08:00
    一律一把梭 益寿延年😂
    Vaspike
        14
    Vaspike  
       2022-08-09 08:34:32 +08:00
    一楼正解,用 String+Jackson 可保平安
    fuxinya
        15
    fuxinya  
       2022-08-09 09:13:48 +08:00
    springboot openfeign + 1

    国内这些个厂商,提供的 API 经常不遵守标准,明明是个 json ,返回的 Content-Type 却是 text/plain
    我甚至见过这样的:Content-Type:application/json:charset=UTF-8;charset=UTF-8 ,给他们提 bug 还说这关 Spring 框架什么事?没办法,自己搞个 Decoder 修改响应头适配呗。
    kytrun
        16
    kytrun  
       2022-08-09 10:00:19 +08:00
    同 feign ,前几天刚写了一篇关于 [Spring Cloud Feign 去除全局包装、统一异常处理]( https://kytrun.com/spring-cloud-feign-unwrap-and-exception/) 的文章
    lequal
        17
    lequal  
       116 天前
    @chendy 学到了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   968 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:38 · PVG 06:38 · LAX 14:38 · JFK 17:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.