如何使用OpenFeign获取pojo数组?

时间:2019-03-05 22:21:12

标签: java arrays json gson netflix-feign

我正在尝试使用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);

有人有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您破坏了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有效负载有效并可以反序列化。