【问题标题】:How to use OpenFeign to get a pojo array?如何使用 OpenFeign 获取 pojo 数组?
【发布时间】:2019-03-05 22:21:11
【问题描述】:

我正在尝试使用 OpenFeign 客户端访问 API,获取一些 JSON,并将其转换为 POJO 数组。

以前我只是简单地获取一个 JSON 字符串并使用 Gson 将其转换为这样的数组

FeignInterface {
    String get(Request req);
}
String json = feignClient.get(request);
POJO[] pojoArray = new Gson().fromJson(json, POJO[].class);

这很有效。我想消除额外的步骤并假装自动解码JSON并直接返回一个POJO,所以我正在尝试这个

FeignInterface {
    POJO[] get(Request req);
}
POJO[] pojoArray = feignClient.getJsonPojo(request);`

我遇到了这个错误

feign.codec.DecodeException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 2 path $

两种方法都使用同一个构建器

feignClient = Feign.builder()
     .encoder(new GsonEncoder())
     .decoder(new GsonDecoder())
     .target(FeignInterface.class, apiUrl);

有人有什么想法吗?

【问题讨论】:

  • 你能分享一个例子JSON有效载荷吗?看起来它不是以JSON 而是以String 发送的,所以它从" 而不是[{ 开始。可能您需要注册某种拦截器,它可以让您从传入的有效负载中删除"。见“Expected BEGIN_OBJECT but was STRING at line 1 column 1”
  • 为什么要专门创建一个数组?使用CollectionList 更为常见。
  • @chrylis 之后我确实将其转换为List,但无论如何我不明白为什么它没有作为数组返回
  • @MichałZiober [\r\n {\r\n "key": "value",\r\n etc 等
  • @MichałZiober 您关于它是String 的原始评论是正确的。我实现了一个新的feign.codec.Decoder,并使用它让 Feign 客户端将 json 作为 pojo 数组返回。

标签: java arrays json gson netflix-feign


【解决方案1】:

你破坏了JSON 有效载荷。在序列化之前,您需要删除所有不受支持的字符。 Feign 允许这样做:

如果您需要在将响应提供给解码器之前对其进行预处理, 您可以使用 mapAndDecode 构建器方法。一个示例用例是 处理仅服务于 jsonp 的 API,您可能需要 在将 jsonp 发送到您选择的 Json 解码器之前解包:

public class Example {
  public static void main(String[] args) {
    JsonpApi jsonpApi = Feign.builder()
         .mapAndDecode((response, type) -> jsopUnwrap(response, type), new GsonDecoder())
         .target(FeignInterface.class, apiUrl);
  }
}

因此,您需要在配置中执行相同的操作,并且:

  • trim 响应并删除有效载荷开头和结尾的所有whitespaces
  • 删除所有new_line 字符,例如:\r\n\r\n

使用online tool 确保您的JSON 有效负载有效并且可以反序列化。

【讨论】:

    猜你喜欢
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多