gpt4 book ai didi

java - 使用带有泛型的 Jackson ObjectMapper 到 POJO 而不是 LinkedHashMap

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:36:34 25 4
gpt4 key购买 nike

我正在使用 Jersey 定义如下服务:

@Path("/studentIds")
public void writeList(JsonArray<Long> studentIds){
//iterate over studentIds and save them
}

JsonArray 在哪里:

public class JsonArray<T> extends ArrayList<T> {  
public JsonArray(String v) throws IOException {
ObjectMapper objectMapper = new ObjectMapper(new MappingJsonFactory());
TypeReference<ArrayList<T>> typeRef = new TypeReference<ArrayList<T>>() {};
ArrayList<T> list = objectMapper.readValue(v, typeRef);
for (T x : list) {
this.add((T) x);
}
}
}

这工作得很好,但是当我做一些更复杂的事情时:

@Path("/studentIds")
public void writeList(JsonArray<TypeIdentifier> studentIds){
//iterate over studentIds and save them by type
}

Bean 是一个简单的 POJO,例如

public class TypeIdentifier {
private String type;
private Long id;
//getters/setters
}

整个事情都崩溃了。它将所有内容转换为 LinkedHashMap 而不是实际对象。如果我手动创建一个类,我可以让它工作:

public class JsonArrayTypeIdentifier extends ArrayList<TypeIdentifier> { 
public JsonArrayTypeIdentifier(String v) throws IOException {
ObjectMapper objectMapper = new ObjectMapper(new MappingJsonFactory());
TypeReference<ArrayList<TypeIdentifier>> typeRef = new TypeReference<ArrayList<TypeIdentifier>>(){};
ArrayList<TypeIdentifier> list = objectMapper.readValue(v, typeRef);
for(TypeIdentifier x : list){
this.add((TypeIdentifier) x);
}
}
}

但我试图在不添加额外类的情况下保持这种漂亮和通用。关于为什么仅通用版本会发生这种情况的任何线索?

最佳答案

首先,它适用于 Longs,因为它是一种原生类型,因此是 JSON 整数的默认绑定(bind)。

但是至于为什么没有正确传递通用类型信息:这很可能是由于 JAX-RS API 将类型传递给 MessageBodyReaderMessageBodyWriter 的方式有问题s -- 传递 java.lang.reflect.Type 不足以(不幸的是!)传递实际的泛型声明(有关这方面的更多信息,请阅读 this blog entry)。

一个简单的解决方法是创建辅助类型,例如:

class MyTypeIdentifierArray extends JsonArray<TypeIdentifier> { }

并使用该类型——一切都会“正常工作”,因为总是保留父类(super class)型通用信息。

关于java - 使用带有泛型的 Jackson ObjectMapper 到 POJO 而不是 LinkedHashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8903863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com