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

2022-08-08 15:33:48 +08:00
 uSy62nMkdH

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

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

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

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

2615 次点击
所在节点    Java
16 条回复
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
2022-08-08 15:49:59 +08:00
@chendy
fastjson 的 MessageConverter 支持的 Content-Type 是 ALL 哈哈
我现在已经准备拿 string 一把梭了😭
LeegoYih
2022-08-08 15:50:28 +08:00
可以试试用 OpenFeign ,通过方法方式调用

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

exchange 不是可以指定 ResponseEntity 泛型。
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
2022-08-08 16:15:07 +08:00
@chendy 非常同意。。 因为我就是这么做的。 使用 jackson 或 gson 转换,调试也方便。
lazyfighter
2022-08-08 16:41:24 +08:00
我都是自己封装 httpUtil
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
2022-08-08 18:12:27 +08:00
这东西为什么单独拿出来用
RedBeanIce
2022-08-08 21:29:31 +08:00
@LeegoYih springboot 项目直接引入 openfeign 嘛,,,好像挺不错的诶。。
Leviathann
2022-08-08 21:37:14 +08:00
这破玩意的 api 突出一个乱七八糟
zhangxzh
2022-08-09 00:58:42 +08:00
@RedBeanIce 单独的 feign 应对简单客户端就足够了,openfeign 的间接依赖太重而且即使新版好像还挂着 cve 的牌子。同时欢迎换用 reative 和 WebClient
xiangyuecn
2022-08-09 01:26:02 +08:00
一律一把梭 益寿延年😂
Vaspike
2022-08-09 08:34:32 +08:00
一楼正解,用 String+Jackson 可保平安
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
2022-08-09 10:00:19 +08:00
同 feign ,前几天刚写了一篇关于 [Spring Cloud Feign 去除全局包装、统一异常处理]( https://kytrun.com/spring-cloud-feign-unwrap-and-exception/) 的文章

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/871439

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX