From e2a07659ab3bcef618661c94583a4596765cf1a6 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Mon, 4 Apr 2016 22:20:04 +0200 Subject: [PATCH] Add generics support for WebResponseExtractors This commit adds generics support for WebResponseExtractors. Types should be described using a ResolvableType, which can be created with static methods like: // for the type Event ResolvableType.forClassWithGenerics(Event.class, Registration.class) Fixes #89 --- .../reactive/WebResponseExtractors.java | 62 ++++++++++++++----- 1 file changed, 47 insertions(+), 15 deletions(-) diff --git a/spring-web-reactive/src/main/java/org/springframework/web/client/reactive/WebResponseExtractors.java b/spring-web-reactive/src/main/java/org/springframework/web/client/reactive/WebResponseExtractors.java index ac4331b6cb..2d3d7aeda8 100644 --- a/spring-web-reactive/src/main/java/org/springframework/web/client/reactive/WebResponseExtractors.java +++ b/spring-web-reactive/src/main/java/org/springframework/web/client/reactive/WebResponseExtractors.java @@ -47,33 +47,47 @@ public class WebResponseExtractors { /** * Extract the response body and decode it, returning it as a {@code Mono} + * @see ResolvableType#forClassWithGenerics(Class, Class[]) */ - public static WebResponseExtractor> body(Class sourceClass) { - - ResolvableType resolvableType = ResolvableType.forClass(sourceClass); + public static WebResponseExtractor> body(ResolvableType bodyType) { //noinspection unchecked return webResponse -> (Mono) webResponse.getClientResponse() - .flatMap(resp -> decodeResponseBody(resp, resolvableType, webResponse.getMessageDecoders())) + .flatMap(resp -> decodeResponseBody(resp, bodyType, webResponse.getMessageDecoders())) .next(); } + /** + * Extract the response body and decode it, returning it as a {@code Mono} + */ + public static WebResponseExtractor> body(Class sourceClass) { + ResolvableType bodyType = ResolvableType.forClass(sourceClass); + return body(bodyType); + } + + + /** + * Extract the response body and decode it, returning it as a {@code Flux} + * @see ResolvableType#forClassWithGenerics(Class, Class[]) + */ + public static WebResponseExtractor> bodyStream(ResolvableType bodyType) { + return webResponse -> webResponse.getClientResponse() + .flatMap(resp -> decodeResponseBody(resp, bodyType, webResponse.getMessageDecoders())); + } + /** * Extract the response body and decode it, returning it as a {@code Flux} */ public static WebResponseExtractor> bodyStream(Class sourceClass) { - - ResolvableType resolvableType = ResolvableType.forClass(sourceClass); - return webResponse -> webResponse.getClientResponse() - .flatMap(resp -> decodeResponseBody(resp, resolvableType, webResponse.getMessageDecoders())); + ResolvableType bodyType = ResolvableType.forClass(sourceClass); + return bodyStream(bodyType); } /** * Extract the full response body as a {@code ResponseEntity} * with its body decoded as a single type {@code T} + * @see ResolvableType#forClassWithGenerics(Class, Class[]) */ - public static WebResponseExtractor>> response(Class bodyClass) { - - ResolvableType bodyType = ResolvableType.forClass(bodyClass); + public static WebResponseExtractor>> response(ResolvableType bodyType) { return webResponse -> webResponse.getClientResponse() .then(response -> { List> decoders = webResponse.getMessageDecoders(); @@ -89,16 +103,34 @@ public class WebResponseExtractors { }); } + /** + * Extract the full response body as a {@code ResponseEntity} + * with its body decoded as a single type {@code T} + */ + public static WebResponseExtractor>> response(Class bodyClass) { + ResolvableType bodyType = ResolvableType.forClass(bodyClass); + return response(bodyType); + } + + /** + * Extract the full response body as a {@code ResponseEntity} + * with its body decoded as a {@code Flux} + * @see ResolvableType#forClassWithGenerics(Class, Class[]) + */ + public static WebResponseExtractor>>> responseStream(ResolvableType type) { + return webResponse -> webResponse.getClientResponse() + .map(response -> new ResponseEntity<>( + decodeResponseBody(response, type, webResponse.getMessageDecoders()), + response.getHeaders(), response.getStatusCode())); + } + /** * Extract the full response body as a {@code ResponseEntity} * with its body decoded as a {@code Flux} */ public static WebResponseExtractor>>> responseStream(Class sourceClass) { ResolvableType resolvableType = ResolvableType.forClass(sourceClass); - return webResponse -> webResponse.getClientResponse() - .map(response -> new ResponseEntity<>( - decodeResponseBody(response, resolvableType, webResponse.getMessageDecoders()), - response.getHeaders(), response.getStatusCode())); + return responseStream(resolvableType); } /**