我使用Jackson + ES将JSON对象反序列化为java POJO。我使用一种简单的方法迭代ElasticSearch提供的SearchResponse:
private List<MyPOJO> toObjects(SearchResponse searchResponse)
{
List<MyPOJO> _objects = new ArrayList<>();
for(SearchHit searchHit: searchResponse.getHits().hits()){
try {
MyPOJO _object = json.readValue(searchHit.source(), MyPOJO.class);
_objects.add(_object);
} catch (IOException e){
e.printStackTrace();
}
}
return _objects;
} // ND: json is a Jackson ObjectMapper instance.
考虑到我为每个POJO重用了很多代码,我试图转换它以接受任意类型而不是固定的MyPOJO类型。 它可以用于Java吗?我搜索了Class&lt; ? &GT;泛型类型和T,但编译器总是给我错误。
答案 0 :(得分:1)
您应该将Class<T>
参数传递给toObjects
函数
private <T> List<T> toObjects(SearchResponse searchResponse, Class<T> clazz)
并将clazz
添加到readValue
来电
T _object = json.readValue(searchHit.source(), clazz);
这是一种直截了当的方式。
如果真的必须在泛型(class ResponseReader<T>
)上构建读者,可以通过反射来实现,但是你应该尽可能地避免这种方式,因为它会导致非常复杂和脆弱代码(和糟糕的表现)。