Использование Jackson ObjectMapper с Generics для POJO вместо LinkedHashMap

Используя Jersey, я определяю такую ​​службу, как:

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

Но я стараюсь сохранить его приятным и универсальным, не добавляя повсюду дополнительных классов. Есть какие-нибудь сведения о том, почему это происходит только с общей версией?

7
задан Will Shaver 18 January 2012 в 00:59
поделиться