2015-09-23 5 views
0

У меня проблема. Я работаю с пользовательской аннотацией, которая принимает параметры метода и преобразует их из json в pojo. Вот пример:Jackson ReadValue не конвертируется в Список <>

... 
MethodParameter param 
// here a parameter from methods, marked with custom annotation 
... 
JSON_MAPPER.readValue(node, param.getParameterType()); 

java.util.LinkedHashMap cannot be cast to com.liferay.portal.kernel.util.KeyValuePair 

Но когда я пытаюсь преобразовать список <> не работает. Но приведенный ниже код отлично работает

JSON_MAPPER.readValue(node, new TypeReference<List<KeyValuePair>>(){}); 

Как я могу определить тип данных о доходе? Что мне делать?

+0

Что такое подпись метода? –

+0

Список настроек - Он помечен пользовательской аннотацией в методе контроллера, а затем переходит к моей пользовательской реализации аннотации @SotiriosDelimanolis – jahra

ответ

2

Я собираюсь предположить, что ваш метод выглядит как

public List<KeyValuePair> methodName(..) {..} 

Другими словами, его возвращаемый тип, что вы хотите JSON быть разобрано как.

Я также собираюсь предположить, что MethodParameter является org.springframework.core.MethodParameter. Вы заметите, что MethodParameter#getParameterType() возвращает Class<?>. В этом случае он вернет объект Class для List.

Учитывая, что List.class, Джексон не знает, какой тип элемента будет. Таким образом, он использует свой по умолчанию LinkedHashMap.

Используйте метод MethodParameter#getGenericParameterType(), который вернет объект Type, полностью описывающий тип возврата List<KeyValuePair>. У Jackson будет достаточно информации о типе, чтобы построить соответствующий объект из JSON.

Вам необходимо преобразовать Type в JavaType, ожидаемый ObjectMapper#readValue.

mapper.readValue(node, mapper.getTypeFactory().constructType(param.getGenericParameterType())); 
+0

Я попытался использовать что-то вроде 'JSON_MAPPER.readValue (node, param.getGenericParameterType()); он не работает, потому что param.getGenericParameter возвращает Type, а не Class, потому что readValue не принимает Type. – jahra

+0

@jahra Извините, я смутил его с помощью Gson, который принимает 'Type'. С помощью Jackson просто используйте 'TypeFactory' для создания' JavaType'. Я редактировал детали. –

+0

Это работает! Это похоже на магию Хогвесдов, но работает! Большое вам спасибо, ты спас меня :) Но у меня есть вопрос. Будет ли он работать, если параметр будет не общим, а простой String или другой тип класса? – jahra

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