2013-12-05 3 views
1

Я использую Spring MVC для API Rest и пытаюсь вызвать следующий метод на контроллере:Нужно ли мне писать пользовательские HttpMessageConverter передать список <Long> в качестве параметра с RestTemplate

@RequestMapping(method=RequestMethod.POST, value=IApiVersion.VERSION_ALL_PREFIX + ORG_RESPONSE_PAUSE_WRITES_URL) 
public @ResponseBody Boolean setResponsePauseWrites(@RequestParam List<Long> orgIds, @RequestParam boolean pauseWrites){ 
    validateDatabusClient(); 
    organizationService.setPauseResponseWrites(orgIds, pauseWrites); 
    return Boolean.TRUE; 
} 

Я использую Спринга RestTemplate подать запрос, как это:

 @Override 
public void setPauseWrites(List<Long> orgIds, boolean pauseWrites){ 
    String orgIdString = StringUtils.collectionToCommaDelimitedString(orgIds); 

    MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>(); 
    parameters.add("orgIds", orgIdString); 
    parameters.add("pauseWrites", Boolean.toString(pauseWrites)); 

    restTemplate.postForObject(orgResponsePauseWritesURL, parameters, Boolean.class); 
} 

Это прекрасно работает и все, но я предпочел бы не нужно, чтобы преобразовать список orgIds в разделенных запятыми строку. Я расстроен, потому что у контроллера Spring mvc нет проблем с преобразованием строк обратно в ожидаемые параметры, List и boolean. Я бы ожидал, что в RestTemplate будет встроенный конвертер сообщений для обработки основных классов Java, таких как List и Boolean.

Когда я пытаюсь этот код:

 @Override 
public void setPauseWrites(List<Long> orgIds, boolean pauseWrites){ 

    MultiValueMap<String, Object> parameters = new LinkedMultiValueMap<>(); 
    parameters.add("orgIds", orgIds); 
    parameters.add("pauseWrites", Boolean.valueOf(pauseWrites)); 

    restTemplate.postForObject(orgResponsePauseWritesURL, parameters, Boolean.class); 
} 

Я получаю следующее сообщение об исключении:

org.springframework.http.converter.HttpMessageNotWritableException: Could not write request: no suitable HttpMessageConverter found for request type [java.util.ArrayList] 

Что такое мой лучший вариант? Я планирую продолжить преобразовывать параметры в Strings для остального шаблона на данный момент, но я хотел бы знать, есть ли MessageConverter, который я могу добавить в мой RestTemplate, чтобы сделать эту работу. В настоящее время я просто использую MessageConverters по умолчанию. Я попытался добавить MappingJacksonMessageConverter и изменить заголовок типа контента для поддержки json, но получаю те же результаты.

спасибо.

ответ

0

Конвертер сообщений относится не только к Java-типу (например, Boolean), который представляет интерес для Java-программиста. Его задача заключается в скрытых объектах Java в представлении байтового потока и из него, которое имеет формат, который идентифицируется носителем типа. Spring только собирается предоставить медиаконвертеры для широко используемых типов носителей. Нет широко используемого типа носителя для списка произвольных объектов Java; как может быть? Что касается списка целых чисел; Я сомневаюсь, что когда-нибудь будет такой тип, как это ни парадоксально, потому что это просто немного простой. Значения типа TSV (tab разделенные) - это простой тип, который может представлять собой простой список целых чисел.

Итак, да, вам придется написать свой собственный конвертер.

+1

Это имеет смысл, спасибо! –