2012-01-18 2 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 –

ответ

1

Прежде всего, он работает с Longs, потому что это своего рода родной тип и как таковая привязка по умолчанию для целых чисел JSON.

Но, почему общая информация о типе не правильно передается: это скорее всего из-за проблем с тем, как JAX-RS API передает типа в MessageBodyReader с и MessageBodyWriter с - прохождение java.lang.reflect.Type нет (к сожалению!) Достаточно передавать фактические общие декларации (для получения дополнительной информации об этом читайте this blog entry).

Простым Обходной создавать типы помощников, как:

class MyTypeIdentifierArray extends JsonArray<TypeIdentifier> { } 

и использовать этот тип - вещи «просто работать», так как супер-типа общей информации всегда сохраняется.

+0

Ваша работа вокруг doesn ' т работы. :(Все еще дает мне LinkedHashMap в качестве результата синтаксического анализа. Вернуться к моему длинному обходному пути. Вздох. –

+0

Это определенно должно работать - можете ли вы показать мне, как именно вы пытаетесь их разобрать? LinkedHashMap возвращается только в случае отсутствия информации о типе (или если 'Object.class' определен как тип) .Какой версией Jackson является? – StaxMan

+0

Jackson version 1.9.2; –

Смежные вопросы