Spring Reactive WebClient PUT请求体传CSV文件遇媒体类型不支持异常
解决WebClient PUT CSV文件时的UnsupportedMediaTypeException问题
核心错误原因
你错误地使用了bodyValue()方法传递BodyInserter实例。bodyValue()用于直接传入请求体对象(比如String、POJO等),而BodyInserter需要通过专门的body()方法传入。这导致WebClient试图将BodyInserter本身作为请求体对象去序列化,找不到对应的编解码器,从而抛出异常。
修正后的代码
直接将bodyValue()替换为body()方法即可解决核心问题:
Resource resource = new PathResource(Path.of("file.txt")); assert resource.exists(); // true assert resource.isReadable(); // true this.webClient .put() .uri(location) .contentType(WebClientConfiguration.MEDIA_TYPE_TEXT_CSV) // new MediaType("text", "csv") .body(BodyInsertors.fromResource(resource)) // 改用body()方法传入BodyInserter .retrieve() .toBodilessEntity();
编解码器补充配置(若仍有问题)
如果修正方法后依然出现媒体类型不支持的问题,可在构建WebClient时显式配置支持text/csv的编解码器:
WebClient webClient = WebClient.builder() .codecs(codecConfigurer -> { // 确保Resource编码器被注册(Spring默认已包含,自定义配置时需显式添加) codecConfigurer.defaultCodecs().resourceEncoder(new ResourceEncoder()); // 配置String解码器支持所有MIME类型,包括text/csv codecConfigurer.defaultCodecs().stringDecoder(StringDecoder.allMimeTypes()); }) .build();
ResourceEncoder默认支持所有媒体类型,能直接将Resource对象按指定的Content-Type输出,满足text/csv的传输要求。
内容的提问来源于stack exchange,提问作者KonradK
相关产品推荐
相关产品推荐

