我是否需要编写自定义HttpMessageConverter以将List <long>作为参数传递给RestTemplate </long>

时间:2013-12-05 18:28:42

标签: java spring rest spring-mvc resttemplate

我使用Spring MVC作为Rest API,并尝试在控制器上调用以下方法:

    @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;
}

我正在使用Spring的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);
}

这样可以正常工作,但我宁愿不需要将orgId列表转换为逗号分隔的字符串。我很沮丧因为spring mvc控制器将字符串转换回它所期望的参数,List和boolean没有问题。我希望RestTemplate有一个内置的消息转换器来处理像List和Boolean这样的基本java类。

当我尝试这段代码时:

        @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 for rest模板调用,但是我想知道是否有一个MessageConverter我可以添加到我的RestTemplate来使其工作。目前我只使用默认的MessageConverters。我尝试添加MappingJacksonMessageConverter并更改我的内容类型标头以支持json,但我得到了相同的结果。

谢谢。

1 个答案:

答案 0 :(得分:0)

消息转换器不仅处理Java程序员感兴趣的Java类型(例如Boolean)。它的工作是将Java对象转换为字节流表示形式,该表示形式具有由媒体类型名称标识的格式。 Spring只会为广泛使用的媒体类型提供媒体转换器。对于任意Java对象的列表,没有广泛使用的媒体类型;怎么会有?至于整数列表;我怀疑会有这样的类型,具有讽刺意味的是,因为它只是有点简单。 TSV(制表符分隔值)媒体类型是一种简单类型,可以表示简单的整数列表。

所以,是的,你必须编写自己的转换器。