Используя Джерси, я определяю сервис как:
@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
}
Где Боб - это простой 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);
}
}
}
Но я пытаюсь сделать это красиво и обобщенно, не добавляя дополнительные классы.Любые наводки на то, почему это происходит только с общей версией?