2016-07-18 2 views
2

Я уже немного отбивал себе голову против этого и до сих пор не испытываю радости. Я новичок в Spring и действительно могу помочь.Spring MVC: Невозможно десериализовать экземпляр из токена START_ARRAY

Я пытаюсь использовать Spring Boot для возврата списка кодов из таблицы DB. Когда я называю мой контроллер REST из URL в браузере ...

Пример URL: локальный: 8081/цис/УБТ/lookupchoice/Os/

возвращает это:

[ 
{"lookupId":10,"choiceGroup":"O.s","choiceCode":null,"displayLabel":"Pending","hidden":false,"displayOrder":1}, 
{"lookupId":11,"choiceGroup":"O.s","choiceCode":null,"displayLabel":"Active","hidden":false,"displayOrder":2}, 
{"lookupId":12,"choiceGroup":"O.s","choiceCode":null,"displayLabel":"Archived","hidden":false,"displayOrder":3}, 
{"lookupId":13,"choiceGroup":"O.s","choiceCode":null,"displayLabel":"Placeholder","hidden":false,"displayOrder":4} 
] 

Но при попытке запустить это с клиентского контроллера появляется сообщение об ошибке. Вызов выглядит следующим образом:

// 
//Compiles but does not work 
LookupChoice lookupChoice = restTemplate.getForObject(REST_URI+"/utl/lookupchoice/O.s/", 
     LookupChoice.class); 

ошибка:вложенного исключение com.fasterxml.jackson.databind.JsonMappingException: Невозможно десериализация экземпляра com.MyPakage.repository.LookupChoice из START_ARRAY маркеров

Предполагая, что ошибка происходит потому, что массив возвращается вместо одного объекта, я изменил код для этого:

// 
//Does not compile 
Iterable<LookupChoice> lookupChoice = restTemplate.getForObject(REST_URI+"/utl/lookupchoice/U.r/", 
     Iterable<LookupChoice.class>); 

Но теперь я Г.Е. t ошибка в Intellij. Это указывает на что "Expression ожидается" для Iterable < LookupChoice.class> парам, и я не могу пройти мимо этого.

Спасибо за ваше время и помощь, Ed

Спасибо за ваш ответ. Я выбрал это, и теперь все работает. Спасибо за вашу помощь!

RestTemplate restTemplate = new RestTemplate(); 
ResponseEntity<Object[]> responseEntity; 
Object[] lookupChoice; 

responseEntity = restTemplate.getForEntity(REST_SERVICE_URI+"/utl/lookupchoice/O.s/" , Object[].class); 
lookupChoice = responseEntity.getBody(); 
model.addAttribute("Status", lookupChoice); 
+0

О вышеупомянутом, есть ли какие-либо улучшения, которые сделают это более элегантным и/или улучшат производительность и т. Д.? – eLowe

ответ

3

Причина он не компилируется, потому что это невозможно в Java, чтобы передать класс параметров универсального типа, потому что они не существуют во время выполнения.

У вас есть два варианта здесь, либо использовать массив (LookupChoice[]) и преобразовать его к List<LookupChoice> при необходимости:

restTemplate.getForObject(url, LookupChoice[]); 

Или вы можете использовать ParameterizedTypeReference:

restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<List<LookupChoice>>() {}).getBody() 

Это интерфейс, хотя, либо подкласс, либо использовать анонимный класс, как в приведенном выше примере кода.

Кроме того, ParameterizedTypeReference работает только на методе exchange(), если я не ошибаюсь, так что вы получите ResponseEntity вместо вашего необработанного объекта, так что вам придется использовать метод getBody().

Смежные вопросы