SpringBootTest中使用WebTestClient无法上传文件的问题
问题解决:WebTestClient 文件上传提示
Required part 'document' is not present 问题原因
测试代码中直接用字节数组构建multipart part,缺少MultipartFile所需的元数据(比如文件名、content-disposition头的filename参数),导致服务器端无法将请求中的part映射到@RequestPart MultipartFile参数,因此抛出400错误。
解决方案
把字节数组替换为Spring的ClassPathResource(或FileSystemResource)构建multipart part,WebTestClient会自动处理必要的元数据,确保服务器端能正确解析为MultipartFile。
修改后的测试代码如下:
@SpringBootTest(classes = {Application.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) class ApplicationTest { @Autowired private WebTestClient webTestClient; @Test void saveDocumentSuccessfully() { webTestClient.post().uri("/upload") .contentType(MediaType.MULTIPART_FORM_DATA) .body(BodyInserters.fromMultipartData(createMultipartBodyBuilder().build())) .exchange() .expectStatus().is2xxSuccessful(); } private @NotNull MultipartBodyBuilder createMultipartBodyBuilder() { final MultipartBodyBuilder multipartBodyBuilder = new MultipartBodyBuilder(); // 使用ClassPathResource直接读取测试资源文件 multipartBodyBuilder.part("document", new ClassPathResource("thumb_oct22_02.jpg"), MediaType.IMAGE_JPEG); return multipartBodyBuilder; } }
额外说明
ClassPathResource会自动从classpath加载文件,无需手动读取字节数组,代码更简洁可靠。- 如果文件不在classpath下,可改用
FileSystemResource指定文件路径。 - 外部REST客户端正常是因为它们会自动在multipart请求中添加filename等元数据,而直接传字节数组时WebTestClient不会自动补充这些信息。
内容的提问来源于stack exchange,提问作者Mathias Arens
相关产品推荐
相关产品推荐

