Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多部分POST请求的TestRestTemplate集成测试返回400_Java_Spring_Spring Boot_Junit_Resttemplate - Fatal编程技术网

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"))