【问题标题】:Do I need to write a custom HttpMessageConverter to pass List<Long> as parameter with RestTemplate我是否需要编写一个自定义 HttpMessageConverter 以将 List<Long> 作为参数传递给 RestTemplate
【发布时间】:2013-12-05 18:28:42
【问题描述】:

我正在将 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);
}

这一切都很好,但我宁愿不需要将 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]

我最好的选择是什么?我现在计划继续将参数转换为字符串以进行其余模板调用,但我想知道是否有一个 MessageConverter 我可以添加到我的 RestTemplate 以使其工作。目前我只是使用默认的 MessageConverters。我尝试添加 MappingJacksonMessageConverter 并更改我的内容类型标头以支持 json,但我得到了相同的结果。

谢谢。

【问题讨论】:

    标签: java spring rest spring-mvc resttemplate


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-08-09
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多