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
参数实际上可能为空的可能性之外,还有其他解决方法吗?