Dropwizard 从 JerseyClient 反序列化通用列表

Dropwizard deserializing generic list from JerseyClient

我想实现一个通用的 class 以用于在本地 MongoDB 实例中缓存来自 REST API 的结果。为此,我需要反序列化从 JerseyClient 获得的集合:

Response response = this.source.request().get();
List<T> list = response.readEntity( new GenericType<List<T>>() {} );

// ... do stuff with the list

假设我在 T 与 class Foo 相关的上下文中使用这段代码。真正奇怪的是,在 readEntity 调用之后,list 不是 List<Foo>,而是 List<LinkedHashMap>。当我明确宣布通用 TFoo 时,这怎么可能?

我需要做什么才能获得合适的 List<T>,即 List<Foo>

注:如果我去掉泛型,使用

List<Foo> list = response.readEntity( new GenericType<List<Foo>>() {} );

直接代替,它工作正常,但我真的需要那个通用的!

Java 最流行的泛型借口:类型擦除

如果您可以将 class 类型作为 Class<T> clazz 传递,那么您可以使用:

GenericType<List<T>> genericType = new GenericType<>(new ParameterizedType() {
  public Type[] getActualTypeArguments() {
    return new Type[]{clazz};
  }

  public Type getRawType() {
    return List.class;
  }

  public Type getOwnerType() {
    return null;
  }
});
response.readEntity(genericType);

您可以使用

import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;
import javax.ws.rs.core.GenericType;

 GenericType<List<T>> genericType = new GenericType<>( 
        ParameterizedTypeImpl.make( List.class, new Type[]{classType}, null));