Spring RestTemplate и XMLStream используют со списком объектов - PullRequest
8 голосов
/ 15 апреля 2011

Я пытаюсь использовать Spring RestTemplate для получения списка сотрудников, например:

public List<Employee> getEmployeesByFirstName(String firstName) {   
return restTemplate.getForObject(employeeServiceUrl + "/firstname/{firstName}", List.class, firstName);
}

Проблема в том, что веб-службы (вызываемые) возвращают следующий формат XML:

.... ....

Таким образом, при выполнении метода выше, я получаю следующееошибка:

org.springframework.http.converter.HttpMessageNotReadableException: Could not read [interface java.util.List]; nested exception is org.springframework.oxm.UnmarshallingFailureException: XStream unmarshalling exception; nested exception is com.thoughtworks.xstream.mapper.CannotResolveClassException: **employees : employees**

Ответы [ 4 ]

16 голосов
/ 21 февраля 2012

Вы, вероятно, ищете что-то вроде этого:

public List<Employee> getEmployeeList() {
  Employee[] list = restTemplate.getForObject("<some URI>", Employee[].class);
  return Arrays.asList(list);
}

Это должно правильно выполнить маршалинг, используя автоматическое распределение.

1 голос
/ 23 августа 2012

Убедитесь, что маршаллеру и Unmarshaller, которые вы передаете в параметре конструктору RestTemplate, задано значение defaultImplementation.

пример:

XStreamMarshaller marshaller = new XStreamMarshaller();
marshaller.getXStream().addDefaultImplementation(ArrayList.class,List.class);

XStreamMarshaller unmarshaller = new XStreamMarshaller();
unmarshaller.getXStream().addDefaultImplementation(ArrayList.class,List.class);

RestTemplate template = new RestTemplate(marshaller, unmarshaller);
0 голосов
/ 11 декабря 2012

Я пытался использовать RestTemplate в качестве RestClient, и следующий код работает для извлечения списка:

public void testFindAllEmployees() {
    Employee[] list = restTemplate.getForObject(REST_SERVICE_URL, Employee[].class);
    List<Employee> elist = Arrays.asList(list);
    for(Employee e : elist){
        Assert.assertNotNull(e);
    }
}

Убедитесь, что ваши доменные объекты правильно аннотированы и XMLStream jar в classpath.Он должен работать при соблюдении вышеуказанного условия.

0 голосов
/ 07 октября 2011

У меня была похожая проблема, и я решил ее, как в этом примере:

http://blog.springsource.com/2009/03/27/rest-in-spring-3-resttemplate/

...