Support for @RequestPart with reactive type wrapper

Issue: SPR-14546
This commit is contained in:
Rossen Stoyanchev
2017-05-03 23:03:47 -04:00
parent fc7bededd0
commit 6f3051c677
3 changed files with 34 additions and 38 deletions

View File

@@ -21,6 +21,7 @@ import java.util.List;
import reactor.core.publisher.Mono;
import org.springframework.core.MethodParameter;
import org.springframework.core.ReactiveAdapter;
import org.springframework.core.ReactiveAdapterRegistry;
import org.springframework.http.codec.multipart.Part;
import org.springframework.util.CollectionUtils;
@@ -61,13 +62,16 @@ public class RequestPartMethodArgumentResolver extends AbstractNamedValueArgumen
@Override
protected Mono<Object> resolveName(String name, MethodParameter param, ServerWebExchange exchange) {
return exchange.getMultipartData().flatMap(allParts -> {
List<Part> parts = allParts.get(name);
if (CollectionUtils.isEmpty(parts)) {
return Mono.empty();
}
return Mono.just(parts.size() == 1 ? parts.get(0) : parts);
});
Mono<Object> partsMono = exchange.getMultipartData()
.filter(map -> !CollectionUtils.isEmpty(map.get(name)))
.map(map -> {
List<Part> parts = map.get(name);
return parts.size() == 1 ? parts.get(0) : parts;
});
ReactiveAdapter adapter = getAdapterRegistry().getAdapter(param.getParameterType());
return (adapter != null ? Mono.just(adapter.fromPublisher(partsMono)) : partsMono);
}
@Override

View File

@@ -16,6 +16,7 @@
package org.springframework.web.reactive.result.method.annotation;
import java.time.Duration;
import java.util.Map;
import java.util.stream.Collectors;
@@ -34,6 +35,7 @@ import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.codec.multipart.FilePart;
import org.springframework.http.codec.multipart.FormFieldPart;
import org.springframework.http.codec.multipart.Part;
import org.springframework.http.server.reactive.AbstractHttpHandlerIntegrationTests;
import org.springframework.http.server.reactive.HttpHandler;
@@ -152,8 +154,9 @@ public class MultipartIntegrationTests extends AbstractHttpHandlerIntegrationTes
static class MultipartController {
@PostMapping("/requestPart")
void requestPart(@RequestPart Part fooPart) {
assertEquals("foo.txt", ((FilePart) fooPart).getFilename());
void requestPart(@RequestPart FormFieldPart barPart, @RequestPart Mono<FilePart> fooPart) {
assertEquals("bar", barPart.getValue());
assertEquals("foo.txt", fooPart.block(Duration.ZERO).getFilename());
}
@PostMapping("/requestBodyMap")