2017-06-14 3 views
1

je les 3 catégories suivantes:erreur désérialisation objets génériques via jackson

public class BaseClass<T>{ 
    private List<T> someList; 
    ... constructor..... 
} 

public class Class1 extends BaseClass<BasePerson>{ .. constructor.. } 

public class Class2 extends BaseClass<Person> { ... constructor... } 

Lorsque désérialisation une des classes Thew (Class1 ou Class2) Je reçois l'erreur suivante:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.somepackage.BasePerson 

j'ai vu quelques-uns réponses concernant cette erreur, tout conseiller en utilisant TypeReference ou TypeFactory ici: answer et ici: another answer

Mon problème est que j'utilise jackson ancienne version (1.9.2) et ne peut pas passer à 2.0. Les deux TypeReference et TypeFactory ont été ajoutés dans l'API 2.0.0.

Quelqu'un peut vous conseiller quoi faire?

+0

une telle version 1.19 ne semble pas exister. Vouliez-vous dire 1.9.1? –

+0

Oui - désolé - 1.9.2 – user1386966

Répondre

0

Ces classes sont définies dans Jackson 1.9. docs et TypeReferenceTypeFactory pertinents

Vous avez ici le cas d'une classe non générique Class1 générique extension avec un type BaseClass<BasePerson>. Voilà comment je crois que vous gérer cela avec un TypeFactory

ObjectMapper mapper = new ObjectMapper(); 
TypeFactory typeFactory = mapper.getTypeFactory(); 
JavaType baseType = typeFactory.constructParametricType(BaseClass.class, BasePerson.class); 
JavaType type = typeFactory.constructSpecializedType(baseType, Class1.class); 

et désérialiser comme ceci:

Class1 class1 = mapper.readValue(json, type);