如何在 java 中使用 spring boot 将多部分文件参数设置为"not required"?



我的问题是我有一个用Java开发的控制器与Spring Boot,我在其中编辑"Portfolio"实体。这里我得到不同的属性来编辑这个实体和一个图像。我的想法是,如果我收到空参数,它将重新分配给实体之前的值,并且只修改在表单中发送的带有某些值的属性。

当我在Postman中进行测试时,这可以正常工作,但是当我将图像属性发送为"undefined"或者作为"null"从angular的表单中,我的后端控制器显示了一个错误:Resolved [org.springframework.web.multipart.support.]MissingServletRequestPartException:所需的请求部件'文件'不存在]

我的想法是使"文件"属性是一个MultipartFile,可以是空的,没有问题。

我的控制器如下:

@PutMapping("/portfolio/edit-data")
public Portfolio editPortfolio (@RequestParam("image")MultipartFile image,
@ModelAttribute("port") Portfolio port,
BindingResult result){

Portfolio portOriginal = portServ.buscarPortfolio(Long.valueOf(1));

if(!image.isEmpty()){
String rutaAbsoluta = "C:\Users\Paul";
try{
byte[] bytesImg = image.getBytes();
Path fullPath = Paths.get(absolutePath + "//" + image.getOriginalFilename());
Files.write(fullPath, bytesImg);
port.setImage(image.getOriginalFilename());
}catch (IOException e){
}
}else{
port.setImage(portOriginal.getImagen());
}

if("".equals(port.getName())){
port.setName(portOriginal.getName());
}
if("".equals(port.getTitle())){
port.setTitle(portOriginal.getTitle());
}
if("".equals(port.getIntroduction())){
port.setIntroduction(portOriginal.getIntroduction());
}
if("".equals(port.getFooter())){
port.setFooter(portOriginal.getFooter());
}

return portServ.editarPortfolio(port, Long.valueOf(1));
}

下面的查询在Postman中是正确的。因此,如果能从angular中提交一个空文件,那就太有用了。

邮差请求

试试@RequestParam(required = false)(不需要用value参数指定名称,因为spring默认使用变量名,在您的情况下它们是相同的)

你的方法定义看起来像这样:

@PutMapping("/portfolio/edit-data")
public Portfolio editPortfolio (@RequestParam(required = false) MultipartFile image,
@ModelAttribute Portfolio port,
BindingResult result)