gpt4 book ai didi

java - 我是否需要编写一个自定义 HttpMessageConverter 来将 List 作为参数与 RestTemplate 一起传递

转载 作者:太空宇宙 更新时间:2023-11-04 15:20:49 25 4
gpt4 key购买 nike

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

    @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 Controller 可以毫无问题地将字符串转换回它期望的参数,列表和 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]

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

谢谢。

最佳答案

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

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

关于java - 我是否需要编写一个自定义 HttpMessageConverter 来将 List<Long> 作为参数与 RestTemplate 一起传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20407813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com