2016-09-20 106 views
2

我遇到了杰克逊已知的关于“序列化中缺少类型信息”的问题(http://wiki.fasterxml.com/JacksonPolymorphicDeserialization) 我无法理解它。 为什么这个工作正常(类类型设置正确)?序列化后为什么类类型丢失?

@Path("{id}") 
@GET 
public List<POJO> getPOJO(@PathParam("id") BigInteger id) { 
    //get some pojoInstances from db 
    List<POJO> arr = new ArrayList<>(pojoInstances); 
    return arr; 
} 

这一个不工作

@Path("{id}") 
@GET 
public Collection<POJO> getPOJO(@PathParam("id") BigInteger id) { 
    //get some pojoInstances from db 
    return new ArrayList<>(pojoInstances); 
} 

回答

1

这是不够的,一定的根本原因,但作为一般规则,这可能是由于Java的类型擦除。避免这类问题的一个简单方法是从不使用泛型类型是根值;即通过REST API序列化或反序列化的立即值。相反,最好有一个POJO,它可以自由包含通用类型,例如List s和Map s。这避免了多态类型信息处理的大多数问题。

避免使用通用根类型的替代方法是使用Java数组:在此例中为POJO[]。数组是完全键入的,不使用泛型,因此类型信息始终可以从实例中获得。