22
22
import java .util .ArrayList ;
23
23
import java .util .List ;
24
24
import java .util .Optional ;
25
+ import java .util .concurrent .CompletableFuture ;
25
26
import java .util .function .Function ;
26
27
import java .util .function .Supplier ;
27
28
63
64
* @author Sebastien Deleuze
64
65
* @author Olga Maciaszek-Sharma
65
66
* @author Sam Brannen
67
+ * @author Mengqi Xu
66
68
* @since 6.0
67
69
*/
68
70
final class HttpServiceMethod {
@@ -412,7 +414,29 @@ public static ResponseFunction create(HttpExchangeAdapter client, Method method)
412
414
"Kotlin Coroutines are only supported with reactive implementations" );
413
415
}
414
416
415
- MethodParameter param = new MethodParameter (method , -1 ).nestedIfOptional ();
417
+ MethodParameter param = new MethodParameter (method , -1 );
418
+ Class <?> paramType = param .getNestedParameterType ();
419
+
420
+ Function <HttpRequestValues , @ Nullable Object > responseFunction ;
421
+ if (paramType .equals (CompletableFuture .class )) {
422
+ MethodParameter bodyParam = param .nested ();
423
+ MethodParameter nestedParamIfOptional = bodyParam .getNestedParameterType ().equals (Optional .class ) ?
424
+ bodyParam .nested () : bodyParam ;
425
+ responseFunction = request ->
426
+ CompletableFuture .supplyAsync (() ->
427
+ asOptionalIfNecessary (buildResponseFunction (client , nestedParamIfOptional ).apply (request ),
428
+ bodyParam .getNestedParameterType ()));
429
+ }
430
+ else {
431
+ responseFunction = request ->
432
+ asOptionalIfNecessary (buildResponseFunction (client , param .nestedIfOptional ()).apply (request ),
433
+ param .getParameterType ());
434
+ }
435
+
436
+ return new ExchangeResponseFunction (responseFunction );
437
+ }
438
+
439
+ private static Function <HttpRequestValues , @ Nullable Object > buildResponseFunction (HttpExchangeAdapter client , MethodParameter param ) {
416
440
Class <?> paramType = param .getNestedParameterType ();
417
441
418
442
Function <HttpRequestValues , @ Nullable Object > responseFunction ;
@@ -423,33 +447,30 @@ public static ResponseFunction create(HttpExchangeAdapter client, Method method)
423
447
};
424
448
}
425
449
else if (paramType .equals (HttpHeaders .class )) {
426
- responseFunction = request -> asOptionalIfNecessary ( client . exchangeForHeaders ( request ), param ) ;
450
+ responseFunction = client :: exchangeForHeaders ;
427
451
}
428
452
else if (paramType .equals (ResponseEntity .class )) {
429
453
MethodParameter bodyParam = param .nested ();
430
454
if (bodyParam .getNestedParameterType ().equals (Void .class )) {
431
- responseFunction = request ->
432
- asOptionalIfNecessary (client .exchangeForBodilessEntity (request ), param );
455
+ responseFunction = client ::exchangeForBodilessEntity ;
433
456
}
434
457
else {
435
458
ParameterizedTypeReference <?> bodyTypeRef =
436
459
ParameterizedTypeReference .forType (bodyParam .getNestedGenericParameterType ());
437
- responseFunction = request ->
438
- asOptionalIfNecessary (client .exchangeForEntity (request , bodyTypeRef ), param );
460
+ responseFunction = request -> client .exchangeForEntity (request , bodyTypeRef );
439
461
}
440
462
}
441
463
else {
442
464
ParameterizedTypeReference <?> bodyTypeRef =
443
465
ParameterizedTypeReference .forType (param .getNestedGenericParameterType ());
444
- responseFunction = request ->
445
- asOptionalIfNecessary (client .exchangeForBody (request , bodyTypeRef ), param );
466
+ responseFunction = request -> client .exchangeForBody (request , bodyTypeRef );
446
467
}
447
468
448
- return new ExchangeResponseFunction ( responseFunction ) ;
469
+ return responseFunction ;
449
470
}
450
471
451
- private static @ Nullable Object asOptionalIfNecessary (@ Nullable Object response , MethodParameter param ) {
452
- return param . getParameterType () .equals (Optional .class ) ? Optional .ofNullable (response ) : response ;
472
+ private static @ Nullable Object asOptionalIfNecessary (@ Nullable Object response , Class <?> type ) {
473
+ return type .equals (Optional .class ) ? Optional .ofNullable (response ) : response ;
453
474
}
454
475
}
455
476
0 commit comments