为了账号安全,请及时绑定邮箱和手机立即绑定

创建多部分表单/数据客户端的 Spring Rest 模板像邮递员一样工作,抛出不可转换的异常

创建多部分表单/数据客户端的 Spring Rest 模板像邮递员一样工作,抛出不可转换的异常

拉丁的传说 2021-11-11 15:57:56
我想将这个带有 multipart/form-data 标头请求的邮递员客户端转换为 spring 模板客户端。现在,我有一个基本的休息控制器,效果很好。@RestController@RequestMapping("/api")public class MainConroller {    private static final Logger log = LoggerFactory.getLogger(MainConroller.class);    @Autowired    private MainService mainService;    public MainConroller(MainService mainService) {        this.mainService = mainService;    }    @PostMapping("/mails/send")    public void send(            @RequestParam("usertoken") String usertoken,            @RequestParam("sendTo") String sendTo,            @RequestParam("subject") String subject,            @RequestParam("content") String content,            @RequestParam(required = false, name = "files") List<MultipartFile> multipartFiles) {        log.debug("{}, {}, {}, {}", usertoken, sendTo, subject, content);        mainService.processMessage(usertoken, sendTo, subject, content, multipartFiles);    }}但是,我需要创建一个休息客户端,所以我使用了一个休息模板,它现在看起来像这样:ArrayList<HttpMessageConverter<?>> converters = new ArrayList<>(            Arrays.asList(new MappingJackson2HttpMessageConverter(), new ResourceHttpMessageConverter(), new FormHttpMessageConverter()));    @Bean    public RestTemplate restTemplate() {        return new RestTemplate(converters);    }问题是当我尝试发送发布请求时,它抛出Exception in thread "main" org.springframework.web.client.RestClientException: Could not write request: no suitable HttpMessageConverter found for request type [org.springframework.util.LinkedMultiValueMap] and content type [multipart/form-data]
查看完整描述

2 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

你把事情搞得太复杂了。您应该使用单个地图来保存表单值,而不是地图的地图。在 Spring Boot 旁边已经提供了一个,RestTemplate所以你不需要再次配置你自己的。


File file = new File("*********");


HttpHeaders httpHeaders = new HttpHeaders();

httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);


MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();

form.add("files", file);

form.add("files", file);

form.add("files", file);


form.add("usertoken", "test");

form.add("sendTo", "test");

form.add("subject", "test");

form.add("content", "test");


HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(form, httpHeaders);


String serverUrl = "****";


restTemplate().postForEntity(serverUrl, requestEntity, String.class);

在RestTemplate(或实际上的FormHttpMessageConverter),将其转化为一个正确的请求。


查看完整回答
反对 回复 2021-11-11
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

默认的 RestTemplate 构造函数不包含任何消息转换器,您需要添加它。例如,您可以这样做:


HttpEntity<MultiValueMap<String, Object>> requestEntity = new 

HttpEntity<MultiValueMap<String, Object>>(parts, requestHeaders);


RestTemplate restTemplate = getRestTemplate();

restTemplate.getMessageConverters().add(new FormHttpMessageConverter());

restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());


return restTemplate.postForObject(apiURI, requestEntity, String.class);


查看完整回答
反对 回复 2021-11-11
  • 2 回答
  • 0 关注
  • 178 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信