Polish @RequestPart support

This commit is contained in:
Rossen Stoyanchev
2018-03-21 18:26:13 -04:00
parent c1405ef140
commit 94c525cdc8
3 changed files with 46 additions and 22 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2017 the original author or authors.
* Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,7 +16,6 @@
package org.springframework.web.reactive.result.method.annotation;
import java.util.Collections;
import java.util.List;
import reactor.core.publisher.Flux;
@@ -75,25 +74,31 @@ public class RequestPartMethodArgumentResolver extends AbstractMessageReaderArgu
boolean isRequired = (requestPart == null || requestPart.required());
String name = getPartName(parameter, requestPart);
Flux<Part> partFlux = getPartValues(name, exchange);
if (isRequired) {
partFlux = partFlux.switchIfEmpty(Flux.error(getMissingPartException(name, parameter)));
}
Flux<Part> values = exchange.getMultipartData()
.flatMapMany(map -> {
List<Part> parts = map.get(name);
if (CollectionUtils.isEmpty(parts)) {
return isRequired ?
Flux.error(getMissingPartException(name, parameter)) :
Flux.empty();
}
return Flux.fromIterable(parts);
});
ReactiveAdapter adapter = getAdapterRegistry().getAdapter(parameter.getParameterType());
MethodParameter elementType = adapter != null ? parameter.nested() : parameter;
if (Part.class.isAssignableFrom(elementType.getNestedParameterType())) {
if (adapter != null) {
partFlux = adapter.isMultiValue() ? partFlux : partFlux.take(1);
return Mono.just(adapter.fromPublisher(partFlux));
values = adapter.isMultiValue() ? values : values.take(1);
return Mono.just(adapter.fromPublisher(values));
}
else {
return partFlux.next().cast(Object.class);
return values.next().cast(Object.class);
}
}
return partFlux.next().flatMap(part -> {
return values.next().flatMap(part -> {
ServerHttpRequest partRequest = new PartServerHttpRequest(exchange.getRequest(), part);
ServerWebExchange partExchange = exchange.mutate().request(partRequest).build();
return readBody(parameter, isRequired, bindingContext, partExchange);
@@ -113,12 +118,6 @@ public class RequestPartMethodArgumentResolver extends AbstractMessageReaderArgu
return partName;
}
private Flux<Part> getPartValues(String name, ServerWebExchange exchange) {
return exchange.getMultipartData()
.filter(map -> !CollectionUtils.isEmpty(map.get(name)))
.flatMapIterable(map -> map.getOrDefault(name, Collections.emptyList()));
}
private ServerWebInputException getMissingPartException(String name, MethodParameter param) {
String reason = "Required request part '" + name + "' is not present";
return new ServerWebInputException(reason, param);