Spring MVC:java.util.Optional MultipartFile [] @RequestParam参数在multipart / form-data POST

时间:2017-08-29 22:50:26

标签: java spring spring-mvc

Spring 4.1在控制器方法参数中引入了java.util.Optional@RequestParam@RequestHeader的支持。我使用的是Spring 4.3.10。

如果请求参数中不存在Optional @RequestParam,则该值应为Optional.EMPTY,而不是null。但是,处理发布的Optional<MultipartFile[]>请求的控制器方法上的multipart/form-data参数未按预期将该参数转换为Optional.EMPTY,而是将其保留为null

以下是此问题的快速演示:

<form action="<c:url value="/optionalPost"/>" method="post" enctype="multipart/form-data">
  <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
  <input type="submit"/>
</form>

...

@PostMapping("/optionalPost")
public String postTest(@RequestParam Optional<MultipartFile[]> files) {
  System.out.println(files); // prints "null" -- not expected
  return "index";
}

@GetMapping("/optionalGet")
public String getTest(@RequestParam Optional<MultipartFile[]> files) {
  System.out.println(files); // prints "Optional.empty"
  return "index";
}

Optional类型不是MultipartFile[]时,它会按预期运行:

@PostMapping("/optionalPost")
public String postTest(@RequestParam Optional<String> name) {
  System.out.println(name); // prints "Optional.empty"
  return "index";
}

@GetMapping("/optionalGet")
public String getTest(@RequestParam Optional<String> name) {
  System.out.println(name); // prints "Optional.empty"
  return "index";
}

当类型为MultipartFile(而不是MultipartFile[])时,这甚至会有效:

@PostMapping("/optionalPost")
public String postTest(@RequestParam Optional<MultipartFile> file) {
  System.out.println(file); // prints "Optional.empty"
  return "index";
}

@GetMapping("/optionalGet")
public String getTest(@RequestParam Optional<MultipartFile> file) {
  System.out.println(file); // prints "Optional.empty"
  return "index";
}

这是一个已知的限制吗?除了处理这个Optional参数实际上可能为空的可能性之外,还有其他解决方法吗?

0 个答案:

没有答案