Возврат и приведение ResponseEntity - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь вернуть список ResponseEntity и приведу этот ответ в соответствие с моими модельными классами.

Например: если я использую ResponseEntity<List<ApplicationModel>>, он работает хорошо, но я не хочу писать метод ответа для каждой модели.

ResponseEntity метод

    public static <T> ResponseEntity<List<T>> getResponseList(String resourceURL) {
    RestTemplate restTemplate = new RestTemplate();
    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));

    HttpEntity<List<T>> entity = new HttpEntity<List<T>>(headers);
    ResponseEntity<List<T>> response = restTemplate.exchange(resourceURL, HttpMethod.GET, entity,
            new ParameterizedTypeReference<List<T>>() {
            }, Collections.emptyMap());

    return response;
}

Вызов метода

    private final String url ="http://localhost:8090/xxx/application";

    ResponseEntity<List<ApplicationModel> responseForApplications =
 ResponseTemplate.getResponseList(url);

    if (responseForApplications.getStatusCode() == HttpStatus.OK) 
         List<ApplicationModel> dtoApplications = responseForApplications.getBody();

Пример ответа JSON, который я хочу разыграть

{"id": 1," name ":" foo "," description ":" foo "}

Ошибка

Произошла непредвиденная ошибка(тип = Внутренняя ошибка сервера, статус = 500).Ошибка создания бина с именем index: сбой вызова метода init;Вложенным исключением является java.lang.ClassCastException: java.util.LinkedHashMap не может быть приведен к com.xxx.ApplicationModel

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Использование mapper.convertValue работает для меня.

ObjectMapper mapper = new ObjectMapper();
List<ApplicationModel> dtoApplications = mapper.convertValue(responseForApproles.getBody(), new TypeReference<List<ApplicationModel>>() {});
0 голосов
/ 10 июня 2018

Проблема исходит от Джексона.Когда у него недостаточно информации о том, к какому классу десериализоваться, он использует LinkedHashMap.

Поскольку вы не информируете Джексона о типе элемента вашего ArrayList, он не знает, что вы хотите десериализоватьв ArrayList ApplicationModels .Таким образом, он возвращается к значению по умолчанию.

Вместо этого вы, вероятно, могли бы использовать as (JsonNode.class), а затем иметь дело с ObjectMapper более богатым способом, чем позволяет быть уверенным.

Пожалуйста, обратитесь к java.lang.ClassCastException: java.util.LinkedHashMap не может быть приведен к com.testing.models.Account для получения дополнительной информации.

...