2011-12-14 2 views
5

Я использую Spring RestTemplate для совершения звонков с веб-службы REST. Один из этих вызовов - вернуть список объектов определенного типа. Для методов RestTemplate требуется указать аргумент класса для указания ожидаемого типа возвращаемого значения.Как избежать предупреждений компилятора, когда информация о типовом типе недоступна?

// restTemplate is type org.springframework.web.client.RestTemplate 
URI restServiceURI = new URI("http://example.com/foo") 
restTemplate.getForObject(restServiceURI, List<Foo>.class); 

Очевидно, что это не скомпилировано. Вы не можете получить статическое свойство .class, когда вы предоставляете такой аргумент типа. Код компилируется, когда я удаляю аргумент типа, но генерирует предупреждение компилятора rawtypes.

Мой вопрос прост. Я застрял в подавлении предупреждения компилятора или есть более чистый способ кодирования для этого?

ответ

3

Но как бы RestTemplate знать преобразовать элементы списка в экземпляры класса Foo? Вы пытались запустить код, и работает ли он так, как ожидалось?

Один из способов, которым я могу думать обо всем этом, - это использовать массив в качестве типа ввода. например.

restTemplate.getForObject(restServiceURI, Foo[].class); 

Но я не знаю, поддерживается ли это. Если вам действительно нужно десериализовать более сложные типы данных, вам следует подумать об использовании Джексона или Гссона.

С помощью Jackson вы можете использовать класс ObjectMapper, чтобы легко десериализовать данные из большинства источников.

String input = ...; 
ObjectMapper mapper = new ObjectMapper(); 
List<Foo> list = mapper.readValue(input, new TypeReference<List<Foo>>(){}); 

Вышеуказанные работы, потому что вы намеренно создать анонимный класс, который расширяет TypeReference, класс будет помнить свои родовые типы во время выполнения и поэтому он может помочь объект картографа для создания списков Foo. For a fuller explanation.

+0

Джексон находится в пути к классам, а Spring 3.x использует его автоматически для сортировки/отмены маршрута этих потоков. Я надеялся использовать это для себя, но, похоже, мне нужно сделать это на более низком уровне. Я просто удивлен тем, что Spring не предоставил простой способ обработки возвратов коллекции, как это происходит с другими классами шаблонов. –

+0

Этот метод работает с уточнением. Вместо использования RestTemplate.getForObject() я использую RestTemplate.execute() и предоставляю свой собственный ResponseExtractor. Это дает мне доказательство концепции, но я бы предположил, что есть более умный способ определить тип ответа с сервера. Прямо сейчас я предполагаю JSON, но мне нужно будет поддерживать XML в какой-то момент. Спасибо за направление! –

0

Вы можете достичь с помощью этого:

List<Class<Foo>> classList = new ArrayList<Class<Foo>>(); 
restTemplate.getForObject(restServiceURI, classList); 

Если это только один объект, а не список класса, то вы можете просто передать так:

restTemplate.getForObject(restServiceURI, Foo.class); 
+0

Предлагаемый метод дает ошибки компиляции. –

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