我正在使用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 泛型和T,但是编译器总是给我错误。
最佳答案
您应该将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>
)上构建阅读器,则可以通过反射进行,但是您应尽可能避免这种方式,因为这会导致非常复杂和脆弱的代码(以及不良的性能)。