Использование Джерси я определяю обслуживание как:Использование Джексона 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);
}
}
}
Но я стараюсь держать это хороший и универсальный без добавления дополнительных классов во всем. Любые причины, почему это происходит только с общей версией?
См. Возможный дубликат с принятым ответом: http://stackoverflow.com/questions/6062011/jackson-is-not-deserialising-a-generic-list-that-it-has-serialised –