从JerseyClient反序列化通用列表的Dropwizard

时间:2015-03-27 18:02:33

标签: jersey jackson dropwizard

我想实现一个泛型类,用于缓存本地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相关的Foo上下文中使用了这段代码。真的很奇怪的是,在readEntity来电之后,list不是List<Foo>,而是List<LinkedHashMap>。当我明确宣布Generic TFoo时,这怎么可能呢?

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

注意:如果我删除了通用,请使用

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

直接相反,它工作正常,但我真的需要那个通用的存在!

2 个答案:

答案 0 :(得分:5)

Java最普遍的泛型借口:类型擦除

如果您可以将班级类型传递为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);

答案 1 :(得分:0)

您可以使用

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));