Get infos
Controller
@PostMapping(path = "/test", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public EntityInfo createNewEntityWithImage(@RequestParam String imageName, @RequestParam("file") MultipartFile file) throws IOException {
try (InputStream inputFileData = file.getInputStream()) {
System.out.println("createNewEntityWithImage");
DbEntityInfo info = imagesSvc.putNew(imageName, file.getOriginalFilename(), inputFileData);
return mapItem(info);
}
}
解释 可以看到,在HTML中,我标注的数据格式是
multipart/form-data ,并且在PostMapping的注解中,我标注的数据格式也是
consumes = MediaType.MULTIPART_FORM_DATA_VALUE。
理论上来说,这两个是可以匹配到一起的,因为他们标注的数据类型都是 multipart/form-data。 错误重现
可以看到在这里,request的内容种类被转化为了application/x-www-form-urlencoded,并不是我们需要的multipart/form-data。并且相应的,在Spring的后台Console中,我们也能发现Spring对于没有找到合适的Controller所发出的警告:2021-10-25 10:43:05.208 WARN 16414 — [nio-8080-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter ‘value’ for method parameter type String is not present]。
原因 在HTML文件中,标注数据格式时,多加了个一个空格 multipart/form-data[space],就导致了浏览器在处理页面数据的时候,不知道数据格式是 multipart/form-data,所以就自动把数据格式按照默认值,也就是 application/x-www-form-urlencoded的方式处理后,传给了Spring后台。Spring后台在接收到 application/x-www-form-urlencoded的数据格式后,开始拿着这个数据格式去自己的Controllers里边问,有没有需要这个数据格式的。并且由于在传递时,文件的id也是对应的,所以Spring在找Controller的时候,还得带上看看Controller需要的参数是不是 file、imageName。
然而,除了 createNewEntityWithImage外,没有方法需要 file、imageName这两个参数。而 createNewEntityWithImage需要的数据类型又是 multipart/form-data,就导致了Spring找不到相应的处理方法。前台也就返回了400的错误状态。
解决 将HTML中的空格删去,并且重新加载Chrome中的页面,以防止Chrome使用加载进缓存中的错误HTML文件。



