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>
。当我明确宣布通用 T
为 Foo
时,这怎么可能?
我需要做什么才能获得合适的 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));
我想实现一个通用的 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>
。当我明确宣布通用 T
为 Foo
时,这怎么可能?
我需要做什么才能获得合适的 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));