From c9f488363da35b76352ddfad7cf4773a15ad3cb9 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Sat, 5 May 2018 14:39:43 +0200 Subject: [PATCH] Fine-tuned assertions and related polishing --- .../expression/spel/standard/Tokenizer.java | 2 +- .../org/springframework/http/HttpHeaders.java | 2 +- .../function/client/ClientRequest.java | 4 +- .../client/DefaultClientRequestBuilder.java | 42 ++++++----- .../client/DefaultClientResponseBuilder.java | 10 ++- .../client/DefaultWebClientBuilder.java | 4 +- .../server/DefaultEntityResponseBuilder.java | 1 - .../DefaultRenderingResponseBuilder.java | 1 - .../function/server/DefaultServerRequest.java | 6 +- .../server/DefaultServerRequestBuilder.java | 71 ++++++++----------- .../server/DefaultServerResponseBuilder.java | 46 ++++-------- .../function/server/ServerRequest.java | 18 ++--- .../ResponseEntityExceptionHandlerTests.java | 2 + 13 files changed, 85 insertions(+), 124 deletions(-) diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/standard/Tokenizer.java b/spring-expression/src/main/java/org/springframework/expression/spel/standard/Tokenizer.java index efbd3642333..36f965cde5c 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/standard/Tokenizer.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/standard/Tokenizer.java @@ -265,7 +265,7 @@ class Tokenizer { raiseParseException(this.pos, SpelMessage.UNEXPECTED_ESCAPE_CHAR); break; default: - throw new IllegalStateException("Cannot handle ('" + ch + "')"); + throw new IllegalStateException("Cannot handle (" + (int) ch + ") '" + ch + "'"); } } } diff --git a/spring-web/src/main/java/org/springframework/http/HttpHeaders.java b/spring-web/src/main/java/org/springframework/http/HttpHeaders.java index 961662aad25..9300d532760 100644 --- a/spring-web/src/main/java/org/springframework/http/HttpHeaders.java +++ b/spring-web/src/main/java/org/springframework/http/HttpHeaders.java @@ -414,7 +414,6 @@ public class HttpHeaders implements MultiValueMap, Serializable * Private constructor that can create read-only {@code HttpHeader} instances. */ private HttpHeaders(Map> headers, boolean readOnly) { - Assert.notNull(headers, "'headers' must not be null"); if (readOnly) { Map> map = new LinkedCaseInsensitiveMap<>(headers.size(), Locale.ENGLISH); headers.forEach((key, valueList) -> map.put(key, Collections.unmodifiableList(valueList))); @@ -1556,6 +1555,7 @@ public class HttpHeaders implements MultiValueMap, Serializable * Return a {@code HttpHeaders} object that can only be read, not written to. */ public static HttpHeaders readOnlyHttpHeaders(HttpHeaders headers) { + Assert.notNull(headers, "HttpHeaders must not be null"); return (headers.readOnly ? headers : new HttpHeaders(headers, true)); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/ClientRequest.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/ClientRequest.java index 14901d541e1..50301b7710c 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/ClientRequest.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/ClientRequest.java @@ -114,7 +114,7 @@ public interface ClientRequest { /** * Create a builder with the given method and url. * @param method the HTTP method (GET, POST, etc) - * @param url the URL + * @param url the url (as a URI instance) * @return the created builder * @deprecated in favor of {@link #create(HttpMethod, URI)} */ @@ -126,7 +126,7 @@ public interface ClientRequest { /** * Create a request builder with the given method and url. * @param method the HTTP method (GET, POST, etc) - * @param url the URL + * @param url the url (as a URI instance) * @return the created builder */ static Builder create(HttpMethod method, URI url) { diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultClientRequestBuilder.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultClientRequestBuilder.java index bd3e6bd8e50..6dfbab0965f 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultClientRequestBuilder.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultClientRequestBuilder.java @@ -49,28 +49,30 @@ import org.springframework.web.reactive.function.BodyInserters; */ final class DefaultClientRequestBuilder implements ClientRequest.Builder { + private HttpMethod method; + + private URI url; + private final HttpHeaders headers = new HttpHeaders(); private final MultiValueMap cookies = new LinkedMultiValueMap<>(); private final Map attributes = new LinkedHashMap<>(); - private HttpMethod method; - - private URI url; - - private BodyInserter inserter = BodyInserters.empty(); + private BodyInserter body = BodyInserters.empty(); public DefaultClientRequestBuilder(HttpMethod method, URI url) { - method(method); - url(url); + Assert.notNull(method, "HttpMethod must not be null"); + Assert.notNull(url, "URI must not be null"); + this.method = method; + this.url = url; } public DefaultClientRequestBuilder(ClientRequest other) { Assert.notNull(other, "ClientRequest must not be null"); - method(other.method()); - url(other.url()); + this.method = other.method(); + this.url = other.url(); headers(headers -> headers.addAll(other.headers())); cookies(cookies -> cookies.addAll(other.cookies())); attributes(attributes -> attributes.putAll(other.attributes())); @@ -125,7 +127,7 @@ final class DefaultClientRequestBuilder implements ClientRequest.Builder { Assert.notNull(publisher, "'publisher' must not be null"); Assert.notNull(elementClass, "'elementClass' must not be null"); - this.inserter = BodyInserters.fromPublisher(publisher, elementClass); + this.body = BodyInserters.fromPublisher(publisher, elementClass); return this; } @@ -136,7 +138,7 @@ final class DefaultClientRequestBuilder implements ClientRequest.Builder { Assert.notNull(publisher, "'publisher' must not be null"); Assert.notNull(typeReference, "'typeReference' must not be null"); - this.inserter = BodyInserters.fromPublisher(publisher, typeReference); + this.body = BodyInserters.fromPublisher(publisher, typeReference); return this; } @@ -154,14 +156,13 @@ final class DefaultClientRequestBuilder implements ClientRequest.Builder { @Override public ClientRequest.Builder body(BodyInserter inserter) { - this.inserter = inserter; + this.body = inserter; return this; } @Override public ClientRequest build() { - return new BodyInserterRequest(this.method, this.url, this.headers, this.cookies, - this.inserter, this.attributes); + return new BodyInserterRequest(this.method, this.url, this.headers, this.cookies, this.body, this.attributes); } @@ -175,20 +176,19 @@ final class DefaultClientRequestBuilder implements ClientRequest.Builder { private final MultiValueMap cookies; - private final BodyInserter inserter; + private final BodyInserter body; private final Map attributes; public BodyInserterRequest(HttpMethod method, URI url, HttpHeaders headers, - MultiValueMap cookies, - BodyInserter inserter, + MultiValueMap cookies, BodyInserter body, Map attributes) { this.method = method; this.url = url; this.headers = HttpHeaders.readOnlyHttpHeaders(headers); this.cookies = CollectionUtils.unmodifiableMultiValueMap(cookies); - this.inserter = inserter; + this.body = body; this.attributes = Collections.unmodifiableMap(attributes); } @@ -214,7 +214,7 @@ final class DefaultClientRequestBuilder implements ClientRequest.Builder { @Override public BodyInserter body() { - return this.inserter; + return this.body; } @Override @@ -240,17 +240,15 @@ final class DefaultClientRequestBuilder implements ClientRequest.Builder { })); } - return this.inserter.insert(request, new BodyInserter.Context() { + return this.body.insert(request, new BodyInserter.Context() { @Override public List> messageWriters() { return strategies.messageWriters(); } - @Override public Optional serverRequest() { return Optional.empty(); } - @Override public Map hints() { return Collections.emptyMap(); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultClientResponseBuilder.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultClientResponseBuilder.java index 5e5a2451316..1320c20d32d 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultClientResponseBuilder.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultClientResponseBuilder.java @@ -42,16 +42,16 @@ import org.springframework.util.MultiValueMap; */ final class DefaultClientResponseBuilder implements ClientResponse.Builder { + private ExchangeStrategies strategies; + + private HttpStatus statusCode = HttpStatus.OK; + private final HttpHeaders headers = new HttpHeaders(); private final MultiValueMap cookies = new LinkedMultiValueMap<>(); - private HttpStatus statusCode = HttpStatus.OK; - private Flux body = Flux.empty(); - private ExchangeStrategies strategies; - public DefaultClientResponseBuilder(ExchangeStrategies strategies) { Assert.notNull(strategies, "ExchangeStrategies must not be null"); @@ -84,7 +84,6 @@ final class DefaultClientResponseBuilder implements ClientResponse.Builder { @Override public ClientResponse.Builder headers(Consumer headersConsumer) { - Assert.notNull(headersConsumer, "Consumer must not be null"); headersConsumer.accept(this.headers); return this; } @@ -99,7 +98,6 @@ final class DefaultClientResponseBuilder implements ClientResponse.Builder { @Override public ClientResponse.Builder cookies(Consumer> cookiesConsumer) { - Assert.notNull(cookiesConsumer, "Consumer must not be null"); cookiesConsumer.accept(this.cookies); return this; } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClientBuilder.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClientBuilder.java index 773a99628c1..ac637f620fa 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClientBuilder.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClientBuilder.java @@ -208,9 +208,7 @@ final class DefaultWebClientBuilder implements WebClient.Builder { private static @Nullable HttpHeaders unmodifiableCopy(@Nullable HttpHeaders original) { if (original != null) { - HttpHeaders copy = new HttpHeaders(); - copy.putAll(original); - return HttpHeaders.readOnlyHttpHeaders(copy); + return HttpHeaders.readOnlyHttpHeaders(original); } else { return null; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultEntityResponseBuilder.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultEntityResponseBuilder.java index cc930304a66..2ac629d1190 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultEntityResponseBuilder.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultEntityResponseBuilder.java @@ -96,7 +96,6 @@ class DefaultEntityResponseBuilder implements EntityResponse.Builder { @Override public EntityResponse.Builder cookies(Consumer> cookiesConsumer) { - Assert.notNull(cookiesConsumer, "Consumer must not be null"); cookiesConsumer.accept(this.cookies); return this; } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultRenderingResponseBuilder.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultRenderingResponseBuilder.java index 5fb6957f15f..ecb2ef9ade8 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultRenderingResponseBuilder.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultRenderingResponseBuilder.java @@ -99,7 +99,6 @@ final class DefaultRenderingResponseBuilder implements RenderingResponse.Builder @Override public RenderingResponse.Builder cookies(Consumer> cookiesConsumer) { - Assert.notNull(cookiesConsumer, "Consumer must not be null"); cookiesConsumer.accept(this.cookies); return this; } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultServerRequest.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultServerRequest.java index cfcbf0f8ecb..893dc0980ce 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultServerRequest.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultServerRequest.java @@ -76,14 +76,10 @@ class DefaultServerRequest implements ServerRequest { DefaultServerRequest(ServerWebExchange exchange, List> messageReaders) { this.exchange = exchange; - this.messageReaders = unmodifiableCopy(messageReaders); + this.messageReaders = Collections.unmodifiableList(new ArrayList<>(messageReaders)); this.headers = new DefaultHeaders(); } - private static List unmodifiableCopy(List list) { - return Collections.unmodifiableList(new ArrayList<>(list)); - } - @Override public String methodName() { diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultServerRequestBuilder.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultServerRequestBuilder.java index cab2e6958ab..32df803f190 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultServerRequestBuilder.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultServerRequestBuilder.java @@ -67,37 +67,39 @@ import org.springframework.web.util.UriUtils; */ class DefaultServerRequestBuilder implements ServerRequest.Builder { - private final HttpHeaders headers = new HttpHeaders(); - - private final MultiValueMap cookies = new LinkedMultiValueMap<>(); - - private final Map attributes = new LinkedHashMap<>(); - private final List> messageReaders; private ServerWebExchange exchange; - private HttpMethod method = HttpMethod.GET; + private String methodName; - @Nullable private URI uri; + private final HttpHeaders headers = new HttpHeaders(); + + private final MultiValueMap cookies = new LinkedMultiValueMap<>(); + + private final Map attributes = new LinkedHashMap<>(); + private Flux body = Flux.empty(); + public DefaultServerRequestBuilder(ServerRequest other) { Assert.notNull(other, "ServerRequest must not be null"); this.messageReaders = other.messageReaders(); this.exchange = other.exchange(); - method(other.method()); - uri(other.uri()); + this.methodName = other.methodName(); + this.uri = other.uri(); headers(headers -> headers.addAll(other.headers().asHttpHeaders())); cookies(cookies -> cookies.addAll(other.cookies())); + attributes(attributes -> attributes.putAll(other.attributes())); } + @Override public ServerRequest.Builder method(HttpMethod method) { Assert.notNull(method, "'method' must not be null"); - this.method = method; + this.methodName = method.name(); return this; } @@ -118,7 +120,6 @@ class DefaultServerRequestBuilder implements ServerRequest.Builder { @Override public ServerRequest.Builder headers(Consumer headersConsumer) { - Assert.notNull(headersConsumer, "'headersConsumer' must not be null"); headersConsumer.accept(this.headers); return this; } @@ -132,10 +133,7 @@ class DefaultServerRequestBuilder implements ServerRequest.Builder { } @Override - public ServerRequest.Builder cookies( - Consumer> cookiesConsumer) { - - Assert.notNull(cookiesConsumer, "'cookiesConsumer' must not be null"); + public ServerRequest.Builder cookies(Consumer> cookiesConsumer) { cookiesConsumer.accept(this.cookies); return this; } @@ -174,26 +172,25 @@ class DefaultServerRequestBuilder implements ServerRequest.Builder { @Override public ServerRequest.Builder attributes(Consumer> attributesConsumer) { - Assert.notNull(attributesConsumer, "'attributesConsumer' must not be null"); attributesConsumer.accept(this.attributes); return this; } @Override public ServerRequest build() { - ServerHttpRequest serverHttpRequest = new BuiltServerHttpRequest(this.method, this.uri, - this.headers, this.cookies, this.body); - ServerWebExchange exchange = new DelegatingServerWebExchange(serverHttpRequest, - this.exchange, this.messageReaders); + ServerHttpRequest serverHttpRequest = new BuiltServerHttpRequest( + this.methodName, this.uri, this.headers, this.cookies, this.body); + ServerWebExchange exchange = new DelegatingServerWebExchange( + serverHttpRequest, this.exchange, this.messageReaders); return new DefaultServerRequest(exchange, this.messageReaders); } + private static class BuiltServerHttpRequest implements ServerHttpRequest { private static final Pattern QUERY_PATTERN = Pattern.compile("([^&=]+)(=?)([^&]+)?"); - - private final HttpMethod method; + private final String method; private final URI uri; @@ -207,10 +204,9 @@ class DefaultServerRequestBuilder implements ServerRequest.Builder { private final Flux body; - public BuiltServerHttpRequest(HttpMethod method, URI uri, - HttpHeaders headers, - MultiValueMap cookies, - Flux body) { + public BuiltServerHttpRequest(String method, URI uri, HttpHeaders headers, + MultiValueMap cookies, Flux body) { + this.method = method; this.uri = uri; this.path = RequestPath.parse(uri, null); @@ -245,15 +241,9 @@ class DefaultServerRequestBuilder implements ServerRequest.Builder { return queryParams; } - @Nullable - @Override - public HttpMethod getMethod() { - return this.method; - } - @Override public String getMethodValue() { - return this.method.name(); + return this.method; } @Override @@ -287,6 +277,7 @@ class DefaultServerRequestBuilder implements ServerRequest.Builder { } } + private static class DelegatingServerWebExchange implements ServerWebExchange { private static final ResolvableType FORM_DATA_TYPE = @@ -296,12 +287,10 @@ class DefaultServerRequestBuilder implements ServerRequest.Builder { MultiValueMap.class, String.class, Part.class); private static final Mono> EMPTY_FORM_DATA = - Mono.just(CollectionUtils.unmodifiableMultiValueMap(new LinkedMultiValueMap(0))) - .cache(); + Mono.just(CollectionUtils.unmodifiableMultiValueMap(new LinkedMultiValueMap(0))).cache(); private static final Mono> EMPTY_MULTIPART_DATA = - Mono.just(CollectionUtils.unmodifiableMultiValueMap(new LinkedMultiValueMap(0))) - .cache(); + Mono.just(CollectionUtils.unmodifiableMultiValueMap(new LinkedMultiValueMap(0))).cache(); private final ServerHttpRequest request; @@ -311,8 +300,9 @@ class DefaultServerRequestBuilder implements ServerRequest.Builder { private final Mono> multipartDataMono; - public DelegatingServerWebExchange(ServerHttpRequest request, ServerWebExchange delegate, - List> messageReaders) { + public DelegatingServerWebExchange( + ServerHttpRequest request, ServerWebExchange delegate, List> messageReaders) { + this.request = request; this.delegate = delegate; this.formDataMono = initFormData(request, messageReaders); @@ -399,7 +389,6 @@ class DefaultServerRequestBuilder implements ServerRequest.Builder { return this.delegate.getPrincipal(); } - @Override public LocaleContext getLocaleContext() { return this.delegate.getLocaleContext(); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultServerResponseBuilder.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultServerResponseBuilder.java index 8dbf77609a8..6de384821b5 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultServerResponseBuilder.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultServerResponseBuilder.java @@ -97,7 +97,6 @@ class DefaultServerResponseBuilder implements ServerResponse.BodyBuilder { @Override public ServerResponse.BodyBuilder headers(Consumer headersConsumer) { - Assert.notNull(headersConsumer, "Consumer must not be null"); headersConsumer.accept(this.headers); return this; } @@ -111,7 +110,6 @@ class DefaultServerResponseBuilder implements ServerResponse.BodyBuilder { @Override public ServerResponse.BodyBuilder cookies(Consumer> cookiesConsumer) { - Assert.notNull(cookiesConsumer, "Consumer must not be null"); cookiesConsumer.accept(this.cookies); return this; } @@ -201,9 +199,8 @@ class DefaultServerResponseBuilder implements ServerResponse.BodyBuilder { public Mono build( BiFunction> writeFunction) { - Assert.notNull(writeFunction, "BiFunction must not be null"); return Mono.just( - new WriterFunctionServerResponse(this.statusCode, this.headers, this.cookies, writeFunction)); + new WriterFunctionResponse(this.statusCode, this.headers, this.cookies, writeFunction)); } @Override @@ -250,15 +247,12 @@ class DefaultServerResponseBuilder implements ServerResponse.BodyBuilder { @Override public Mono body(BodyInserter inserter) { - Assert.notNull(inserter, "BodyInserter must not be null"); return Mono.just( - new BodyInserterServerResponse<>(this.statusCode, this.headers, this.cookies, inserter, this.hints)); + new BodyInserterResponse<>(this.statusCode, this.headers, this.cookies, inserter, this.hints)); } @Override public Mono render(String name, Object... modelAttributes) { - Assert.hasLength(name, "Name must not be empty"); - return new DefaultRenderingResponseBuilder(name) .headers(this.headers) .status(this.statusCode) @@ -269,8 +263,6 @@ class DefaultServerResponseBuilder implements ServerResponse.BodyBuilder { @Override public Mono render(String name, Map model) { - Assert.hasLength(name, "Name must not be empty"); - return new DefaultRenderingResponseBuilder(name) .headers(this.headers) .status(this.statusCode) @@ -290,24 +282,12 @@ class DefaultServerResponseBuilder implements ServerResponse.BodyBuilder { private final MultiValueMap cookies; - protected AbstractServerResponse(int statusCode, HttpHeaders headers, - MultiValueMap cookies) { + protected AbstractServerResponse( + int statusCode, HttpHeaders headers, MultiValueMap cookies) { this.statusCode = statusCode; - this.headers = readOnlyCopy(headers); - this.cookies = readOnlyCopy(cookies); - } - - private static HttpHeaders readOnlyCopy(HttpHeaders headers) { - HttpHeaders copy = new HttpHeaders(); - copy.putAll(headers); - return HttpHeaders.readOnlyHttpHeaders(copy); - } - - private static MultiValueMap readOnlyCopy(MultiValueMap map) { - MultiValueMap copy = new LinkedMultiValueMap<>(); - copy.putAll(map); - return CollectionUtils.unmodifiableMultiValueMap(copy); + this.headers = HttpHeaders.readOnlyHttpHeaders(headers); + this.cookies = CollectionUtils.unmodifiableMultiValueMap(new LinkedMultiValueMap<>(cookies)); } @Override @@ -367,15 +347,16 @@ class DefaultServerResponseBuilder implements ServerResponse.BodyBuilder { } - private static final class WriterFunctionServerResponse extends AbstractServerResponse { + private static final class WriterFunctionResponse extends AbstractServerResponse { private final BiFunction> writeFunction; - public WriterFunctionServerResponse(int statusCode, HttpHeaders headers, + public WriterFunctionResponse(int statusCode, HttpHeaders headers, MultiValueMap cookies, BiFunction> writeFunction) { super(statusCode, headers, cookies); + Assert.notNull(writeFunction, "BiFunction must not be null"); this.writeFunction = writeFunction; } @@ -386,18 +367,19 @@ class DefaultServerResponseBuilder implements ServerResponse.BodyBuilder { } - private static final class BodyInserterServerResponse extends AbstractServerResponse { + private static final class BodyInserterResponse extends AbstractServerResponse { private final BodyInserter inserter; private final Map hints; - public BodyInserterServerResponse(int statusCode, HttpHeaders headers, + public BodyInserterResponse(int statusCode, HttpHeaders headers, MultiValueMap cookies, - BodyInserter inserter, Map hints) { + BodyInserter body, Map hints) { super(statusCode, headers, cookies); - this.inserter = inserter; + Assert.notNull(body, "BodyInserter must not be null"); + this.inserter = body; this.hints = hints; } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/ServerRequest.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/ServerRequest.java index 878133e49b6..b01cbf291aa 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/ServerRequest.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/ServerRequest.java @@ -43,7 +43,6 @@ import org.springframework.http.codec.multipart.Part; import org.springframework.http.server.PathContainer; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.lang.Nullable; -import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.MultiValueMap; import org.springframework.web.reactive.function.BodyExtractor; @@ -125,6 +124,7 @@ public interface ServerRequest { /** * Return the readers used to convert the body of this request. + * @since 5.1 */ List> messageReaders(); @@ -262,7 +262,6 @@ public interface ServerRequest { /** * Return the form data from the body of the request if the Content-Type is * {@code "application/x-www-form-urlencoded"} or an empty map otherwise. - * *

Note: calling this method causes the request body to * be read and parsed in full and the resulting {@code MultiValueMap} is * cached so that this method is safe to call more than once. @@ -272,7 +271,6 @@ public interface ServerRequest { /** * Return the parts of a multipart request if the Content-Type is * {@code "multipart/form-data"} or an empty map otherwise. - * *

Note: calling this method causes the request body to * be read and parsed in full and the resulting {@code MultiValueMap} is * cached so that this method is safe to call more than once. @@ -280,14 +278,14 @@ public interface ServerRequest { Mono> multipartData(); /** - * Returns the web exchange that this request is based on. Manipulating the exchange directly, - * instead of using the methods provided on {@code ServerRequest} and {@code ServerResponse}, - * can lead to irregular results. - * - * @return the web exchange + * Return the web exchange that this request is based on. + *

Note: Manipulating the exchange directly (instead of using the methods provided on + * {@code ServerRequest} and {@code ServerResponse}) can lead to irregular results. + * @since 5.1 */ ServerWebExchange exchange(); + // Static methods /** @@ -305,12 +303,13 @@ public interface ServerRequest { * Create a builder with the status, headers, and cookies of the given request. * @param other the response to copy the status, headers, and cookies from * @return the created builder + * @since 5.1 */ static Builder from(ServerRequest other) { - Assert.notNull(other, "'other' must not be null"); return new DefaultServerRequestBuilder(other); } + /** * Represents the headers of the HTTP request. * @see ServerRequest#headers() @@ -378,6 +377,7 @@ public interface ServerRequest { /** * Defines a builder for a request. + * @since 5.1 */ interface Builder { diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandlerTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandlerTests.java index b78e95b59d5..4f340c2d1a7 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandlerTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandlerTests.java @@ -328,6 +328,8 @@ public class ResponseEntityExceptionHandlerTests { } } + + @SuppressWarnings("unused") void handle(String arg) { }