@ -1,5 +1,5 @@
@@ -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 @@
@@ -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
@@ -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
@@ -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 ) ;