我在J2EE Web应用程序上使用Spring MVC。 我创建了一个方法,将请求体绑定到如上所述的模型
@RequestMapping(value = "/", method = RequestMethod.POST, produces = "application/json")
public AModel createEntity(@Valid @ModelAttribute MyInsertForm myInsertForm) {
// coding..
}
一切都很好,当我在MyEntityForm中包含MultipartFile类型的属性时,我必须使用内容类型“multipart / form-data”发出请求。 此外,一切都很适合这种情况。
我面临的问题是我想将MultipartFile属性作为可选项。 当客户端请求包含文件时,我的方法很有效,但是当客户端请求不包含文件时,spring会抛出一个
HTTP状态500 - 请求处理失败;嵌套异常是org.springframework.web.multipart.MultipartException:无法解析多部分servlet请求;嵌套异常是org.apache.commons.fileupload.FileUploadException:Stream意外结束
有没有办法解决这个问题而不在我的控制器上创建两个方法(一个有MultipartFile而另一个没有)?
我有同样的问题,只是添加required=false
为我工作。请在下面找到示例代码,
@RequestMapping(value = "/", method = RequestMethod.POST, produces = "application/json")
public AModel createEntity(@Valid @ModelAttribute MyInsertForm myInsertForm, @RequestParam(value ="file", required=false) MultipartFile file) {
// coding..
}
尝试添加
(required=false)
到方法签名中的multipart属性。
如果希望使用HTTP发送一个或多个文件,则必须使用多部分请求。这意味着请求的主体将如上所述,
----------------------------- 9051914041544843365972754266 Content-Disposition:form-data; NAME = “文本”
text default ----------------------------- 9051914041544843365972754266 Content-Disposition:form-data; NAME = “file1的”; filename =“a.txt”Content-Type:text / plain
a.txt的内容。
----------------------------- 9051914041544843365972754266 Content-Disposition:form-data; NAME = “file2的”; filename =“a.html”Content-Type:text / html
当您只想发送数据(而不是文件)时,可以将它们作为json,键值对等发送。
当您希望将多部分请求映射到对象时,Spring框架使用@ModelAttribute批注。如果您有正常的键值请求,则使用@RequestBody注释。因此,您不能选择MultipartFile,因为您必须使用不同的注释。使用两种不同的方法,每种请求类型一种,解决了这个问题。例,
@RequestMapping(value = "/withFile", method = RequestMethod.POST, produces = "application/json")
public ReturnModel updateFile(@ModelAttribute RequestModel rm) {
// do something.
}
@RequestMapping(value = "/noFile", method = RequestMethod.PUT, produces = "application/json")
public ReturnModel updateJson(@RequestBody RequestModel rm) {
// do something else.
}