Java 中具有任意 return 类型和 Jackson 序列化程序的通用方法
Generic method in Java with arbitary return type and Jackson serializer
我正在使用 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>
)上构建reader,可以通过反射实现,但你应该避免这种方式,只要可能,因为它会导致非常复杂和脆弱的代码(以及糟糕的性能)。
我正在使用 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>
)上构建reader,可以通过反射实现,但你应该避免这种方式,只要可能,因为它会导致非常复杂和脆弱的代码(以及糟糕的性能)。