2012-01-18 156 views
6

使用泽西我喜欢定义一个服务:使用杰克逊ObjectMapper与泛型的POJO代替LinkedHashMap的

@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); 
     } 
    } 
} 

但我试图保持这个很好,通用,而无需添加额外的类遍及。任何线索为什么只有通用版本发生这种情况?

+0

查看可能与接受的答案重复:http://stackoverflow.com/questions/6062011/jackson-is-not-deserialising-a-generic-list-that-it-has-serialised – 2013-04-14 15:23:16

回答

1

首先,它适用于Longs,因为它是一种本地类型,并且是JSON整数的默认绑定。

但是,为什么泛型类型信息不正确地传递:这很可能是由于与JAX-RS API传递键入MessageBodyReader S和MessageBodyWriter S中的方法问题 - 通过java.lang.reflect.Type不是(可惜!)足以传递实际的通用声明(欲了解更多信息,请阅读this blog entry)。

一个简单的解决办法是创建助手类型,如:

class MyTypeIdentifierArray extends JsonArray<TypeIdentifier> { } 

,并使用该类型 - 事情会“只是工作”,因为超强型通用信息会始终保留。

+0

你的工作没有'工作。 (仍然给我LinkedHashMap作为解析结果。回到我的长解决方法。叹气。 – 2012-01-18 17:38:20

+0

它肯定应该工作 - 你能告诉我你究竟如何解析它们?LinkedHashMap只有在缺少类型信息(或如果'Object.class'被定义为类型),这是哪个杰克逊版本? – StaxMan 2012-01-18 19:50:42

+0

杰克逊版本1.9.2; – 2012-01-19 21:14:34