Как десериализовать универсальный тип с помощью ObjectMapper Jackson

Я изо всех сил пытаюсь упростить свой код. У меня есть обычная операция, которая делает запрос к API и получает объект JSON. Это json может быть Categories, Products и т. д. Я использую jackson ObjectMapper.

В настоящее время у меня есть метод для каждого запроса, но я хочу упростить его одним методом. Например.

myMethod(String Path, Here The class Type)

Одним из таких распространенных методов является:

public List<Category> showCategories() {

    HttpClient client = HttpClientBuilder.create().build();
    HttpGet getRequest = new HttpGet(Constants.GET_CATEGORY);
    getRequest.setHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON);
    getRequest.setHeader(HttpHeaders.COOKIE, Login.getInstance().getToken());

    List<Category> data = null;

    HttpResponse response;
    try {
        response = client.execute(getRequest);
        data = Constants.JSON_MAPPER.readValue(response.getEntity().getContent(), new TypeReference<List<Category>>() {
        });
    } catch (IOException ex) {
        LOGGER.error("Error retrieving categories, " + ex.toString());
    }
    // TODO: Replace List<category> with Observable?
    return data;
}

Единственное, что меняется во всех методах, — это тип извлекаемого объекта.

Можно обобщить линию

Constants.JSON_MAPPER.readValue(response.getEntity().getContent(), new TypeReference<List<Category>>() {
        });

To be

Constants.JSON_MAPPER.readValue(response.getEntity().getContent(), new TypeReference<List<T>>() {
        });

Я пытался добавить в качестве параметра метод Class<T> class, как показано здесь, но получаю сообщение об ошибке Cannot find symbol T


person ElBaulP    schedule 06.03.2015    source источник


Ответы (1)


Наконец-то я нашел решение, вот оно:

public static <T> List<T> getList(String url, Class<T> clazz) {

    HttpClient client = HttpClientBuilder.create().build();
    HttpGet getRequest = new HttpGet(url);
    getRequest.setHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON);
    getRequest.setHeader(HttpHeaders.COOKIE, Login.getInstance().getToken());

    List<T> data = null;

    HttpResponse response;
    try {
        response = client.execute(getRequest);
        data = Constants.JSON_MAPPER.readValue(response.getEntity().getContent(), Constants.JSON_MAPPER.getTypeFactory().constructCollectionType(List.class, clazz));
    } catch (IOException ex) {
        logger.error("Error retrieving  " + clazz.getName() + " " + ex.toString());
    }
    // TODO: Replace List<category> with Observable?
    return data;
}
person ElBaulP    schedule 06.03.2015
comment
Действительно ли дженерики так ужасно плохи в JAVA? Это было бы легко на С#... У меня сейчас такая же проблема, к сожалению... - person Ted; 25.07.2015