Java 多部分POST请求的TestRestTemplate集成测试返回400
我知道类似的问题已经出现过好几次了,但下面建议的修复并没有解决我的问题 我有一个具有以下端点的简单控制器:Java 多部分POST请求的TestRestTemplate集成测试返回400,java,spring,spring-boot,junit,resttemplate,Java,Spring,Spring Boot,Junit,Resttemplate,我知道类似的问题已经出现过好几次了,但下面建议的修复并没有解决我的问题 我有一个具有以下端点的简单控制器: @RequestMapping(method = RequestMethod.POST) public ResponseEntity<String> singleFileUpload(@RequestParam("file") MultipartFile file) { log.debug("Upload controller - POST: {}", file.get
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<String> singleFileUpload(@RequestParam("file") MultipartFile file) {
log.debug("Upload controller - POST: {}", file.getOriginalFilename());
// do something
}
我尝试了以下方法:
@Test
public void testUpload() {
LinkedMultiValueMap<String, Object> parameters = new LinkedMultiValueMap<String, Object>();
parameters.add("file", new org.springframework.core.io.ClassPathResource("image.jpg"));
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<LinkedMultiValueMap<String, Object>> entity = new HttpEntity<LinkedMultiValueMap<String, Object>>(parameters, headers);
ResponseEntity<String> response = testRestTemplate.exchange(UPLOAD, HttpMethod.POST, entity, String.class, "");
// Expect Ok
assertThat(response.getStatusCode(), is(HttpStatus.OK));
}
@测试
公共void testUpload(){
LinkedMultiValueMap参数=新建LinkedMultiValueMap();
parameters.add(“文件”,new org.springframework.core.io.ClassPathResource(“image.jpg”);
HttpHeaders=新的HttpHeaders();
headers.setContentType(MediaType.MULTIPART\u FORM\u DATA);
HttpEntity=新的HttpEntity(参数、标题);
ResponseEntity response=testrestemplate.exchange(UPLOAD,HttpMethod.POST,entity,String.class,“”);
//期待好的
断言(response.getStatusCode(),是(HttpStatus.OK));
}
正如您所看到的,我使用了org.springframework.core.io.ClassPathResource
作为文件的对象,ti的工作非常出色
我希望它有用
如果您想使用
java.nio.file.Path
,也可以使用Angelo文件系统资源
包:org.springframework.core.io.FileSystemResource
例如,您可以这样做:
new FileSystemResource(Path.of("src", "test", "resources", "image.jpg"))
完整代码示例:
@SpringBootTest(webEnvironment=SpringBootTest.webEnvironment.RANDOM\u端口)
公共类上载文件测试{
私有最终testrest模板;
@自动连线
公共上传文件测试(TestRestTemplate模板){
this.template=模板;
}
@试验
public void uploadFileTest(){
var multipart=新的LinkedMultiValueMap();
添加(“文件”,file());
final ResponseEntity post=template.postForEntity(“/upload”,新的HttpEntity(multipart,headers()),String.class);
assertEquals(HttpStatus.OK,post.getStatusCode());
}
私有HttpHeaders标头(){
HttpHeaders=新的HttpHeaders();
headers.setContentType(MediaType.MULTIPART\u FORM\u DATA);
返回标题;
}
私有文件系统资源文件(){
返回新的FileSystemResource(Path.of(“src”、“test”、“resources”、“image.jpg”);
}
}
休息控制器:
@RestController
公共类上载端点{
@后映射(“/upload”)
公共无效上载文件(@RequestParam(“文件”)多部分文件){
System.out.println(file.getSize());
}
}
看起来您正在测试中设置ContentType=MULTIPART\u FORM\u数据。但您的控制器未设置为接收此类请求。尝试使用consumes={MediaType.MULTIPART\u FORM\u DATA\u VALUE}请发布测试类的其余部分,因为有一些缺少的部分我无法复制here@BrunoLeite谢谢你的建议。我试过了,但事实并非如此。您是否实际返回了带有响应实体的字符串?你是否验证了你400条回复的主体内容,以防它提供更多细节?您是否考虑过使用调试器运行它或实现异常处理程序?是的,返回字符串。它在集成测试之外工作良好。在这个测试中,我发布了。我甚至没有得到调试行,所以在它到达控制器主体之前发生了一些事情。我不清楚是什么首先导致了问题。多部分控制器是否与java.io.File
不兼容?不管怎样,它确实很有魅力,谢谢你。这节省了我很多工作@Smajl我想rest模板能够更好地管理org.springframework.core.it.Resource
实现,而不是传递一个简单的java.io.File
我知道这已经很旧了,但是我能问你,你的“image.jpg”文件在你的项目中位于哪里吗?@bot\u bot在我的代码中,图像在类路径下(如果您使用的是maven,则在src/main/resources
中)
new FileSystemResource(Path.of("src", "test", "resources", "image.jpg"))