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

我想将这个带有 multipart/form-data 标头请求的邮递员客户端转换为 spring 模板客户端。

http://img2.mukewang.com/618ccd210001dd2011860627.jpg

现在,我有一个基本的休息控制器,效果很好。


@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]



拉丁的传说
浏览 179回答 2
2回答

凤凰求蛊

你把事情搞得太复杂了。您应该使用单个地图来保存表单值,而不是地图的地图。在 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),将其转化为一个正确的请求。

慕标琳琳

默认的 RestTemplate 构造函数不包含任何消息转换器,您需要添加它。例如,您可以这样做:HttpEntity<MultiValueMap<String, Object>> requestEntity = new&nbsp;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);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java