From cf9033a60d8e84ea32f4cddf467bdc5c145e43a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Fri, 22 Mar 2024 16:04:03 +0100 Subject: [PATCH 1/2] Polishing --- .../web/reactive/function/server/RequestPredicates.java | 2 +- .../web/reactive/function/server/ServerRequest.java | 2 +- .../springframework/web/servlet/function/RequestPredicates.java | 2 +- .../org/springframework/web/servlet/function/ServerRequest.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/RequestPredicates.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/RequestPredicates.java index 856f9e3f51c..956ec7be189 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/RequestPredicates.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/RequestPredicates.java @@ -1351,7 +1351,7 @@ public abstract class RequestPredicates { public String pathVariable(String name) { Map pathVariables = pathVariables(); if (pathVariables.containsKey(name)) { - return pathVariables().get(name); + return pathVariables.get(name); } else { throw new IllegalArgumentException("No path variable with name \"" + name + "\" available"); 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 d4b36cc01db..dee71f14c4e 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 @@ -272,7 +272,7 @@ public interface ServerRequest { default String pathVariable(String name) { Map pathVariables = pathVariables(); if (pathVariables.containsKey(name)) { - return pathVariables().get(name); + return pathVariables.get(name); } else { throw new IllegalArgumentException("No path variable with name \"" + name + "\" available"); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/RequestPredicates.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/RequestPredicates.java index 5cd3e45a594..53374392e40 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/RequestPredicates.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/RequestPredicates.java @@ -1319,7 +1319,7 @@ public abstract class RequestPredicates { public String pathVariable(String name) { Map pathVariables = pathVariables(); if (pathVariables.containsKey(name)) { - return pathVariables().get(name); + return pathVariables.get(name); } else { throw new IllegalArgumentException("No path variable with name \"" + name + "\" available"); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/ServerRequest.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/ServerRequest.java index 33d2e8a1e0f..ef3f0865cd2 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/ServerRequest.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/ServerRequest.java @@ -243,7 +243,7 @@ public interface ServerRequest { default String pathVariable(String name) { Map pathVariables = pathVariables(); if (pathVariables.containsKey(name)) { - return pathVariables().get(name); + return pathVariables.get(name); } else { throw new IllegalArgumentException("No path variable with name \"" + name + "\" available"); From 87dfa492afd0b78e73f040f57162312f42ca32b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Fri, 22 Mar 2024 16:05:17 +0100 Subject: [PATCH 2/2] Refine null-safety in spring-webflux See gh-32475 --- .../web/reactive/config/DelegatingWebFluxConfiguration.java | 4 ++++ .../web/reactive/config/WebFluxConfigurerComposite.java | 2 ++ .../reactive/function/client/DefaultClientRequestBuilder.java | 1 + .../web/reactive/function/client/WebClientException.java | 3 ++- .../function/server/support/ServerRequestWrapper.java | 2 ++ .../web/reactive/handler/AbstractUrlHandlerMapping.java | 2 +- .../reactive/resource/AbstractFileNameVersionStrategy.java | 2 ++ .../web/reactive/resource/AbstractPrefixVersionStrategy.java | 2 ++ .../reactive/result/method/AbstractHandlerMethodMapping.java | 1 + .../result/method/RequestMappingInfoHandlerMapping.java | 3 +++ .../method/annotation/CookieValueMethodArgumentResolver.java | 1 + .../annotation/ExpressionValueMethodArgumentResolver.java | 1 + .../method/annotation/PathVariableMethodArgumentResolver.java | 1 + .../annotation/RequestHeaderMethodArgumentResolver.java | 1 + .../method/annotation/RequestMappingHandlerMapping.java | 1 + .../method/annotation/RequestParamMethodArgumentResolver.java | 1 + 16 files changed, 26 insertions(+), 2 deletions(-) diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/config/DelegatingWebFluxConfiguration.java b/spring-webflux/src/main/java/org/springframework/web/reactive/config/DelegatingWebFluxConfiguration.java index de6d56565b9..57d60f12bf9 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/config/DelegatingWebFluxConfiguration.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/config/DelegatingWebFluxConfiguration.java @@ -22,6 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.format.FormatterRegistry; import org.springframework.http.codec.ServerCodecConfigurer; +import org.springframework.lang.Nullable; import org.springframework.util.CollectionUtils; import org.springframework.validation.MessageCodesResolver; import org.springframework.validation.Validator; @@ -63,12 +64,14 @@ public class DelegatingWebFluxConfiguration extends WebFluxConfigurationSupport } @Override + @Nullable protected Validator getValidator() { Validator validator = this.configurers.getValidator(); return (validator != null ? validator : super.getValidator()); } @Override + @Nullable protected MessageCodesResolver getMessageCodesResolver() { MessageCodesResolver messageCodesResolver = this.configurers.getMessageCodesResolver(); return (messageCodesResolver != null ? messageCodesResolver : super.getMessageCodesResolver()); @@ -110,6 +113,7 @@ public class DelegatingWebFluxConfiguration extends WebFluxConfigurationSupport } @Override + @Nullable protected WebSocketService getWebSocketService() { WebSocketService service = this.configurers.getWebSocketService(); return (service != null ? service : super.getWebSocketService()); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurerComposite.java b/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurerComposite.java index b28810f95d3..21888fc28d9 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurerComposite.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurerComposite.java @@ -61,11 +61,13 @@ public class WebFluxConfigurerComposite implements WebFluxConfigurer { } @Override + @Nullable public Validator getValidator() { return createSingleBean(WebFluxConfigurer::getValidator, Validator.class); } @Override + @Nullable public MessageCodesResolver getMessageCodesResolver() { return createSingleBean(WebFluxConfigurer::getMessageCodesResolver, MessageCodesResolver.class); } 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 1e400fad7d4..f83d924d166 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 @@ -242,6 +242,7 @@ final class DefaultClientRequestBuilder implements ClientRequest.Builder { } @Override + @Nullable public Consumer httpRequest() { return this.httpRequestConsumer; } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/WebClientException.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/WebClientException.java index 1e8f5fde34b..afbd03701a7 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/WebClientException.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/WebClientException.java @@ -17,6 +17,7 @@ package org.springframework.web.reactive.function.client; import org.springframework.core.NestedRuntimeException; +import org.springframework.lang.Nullable; /** * Abstract base class for exception published by {@link WebClient} in case of errors. @@ -42,7 +43,7 @@ public abstract class WebClientException extends NestedRuntimeException { * @param msg the message * @param ex the exception */ - public WebClientException(String msg, Throwable ex) { + public WebClientException(@Nullable String msg, Throwable ex) { super(msg, ex); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/support/ServerRequestWrapper.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/support/ServerRequestWrapper.java index 09f8feacb97..ba5ff5f6e4f 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/support/ServerRequestWrapper.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/support/ServerRequestWrapper.java @@ -41,6 +41,7 @@ import org.springframework.http.codec.multipart.Part; import org.springframework.http.server.PathContainer; import org.springframework.http.server.RequestPath; import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.WebDataBinder; @@ -283,6 +284,7 @@ public class ServerRequestWrapper implements ServerRequest { } @Override + @Nullable public InetSocketAddress host() { return this.headers.host(); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/handler/AbstractUrlHandlerMapping.java b/spring-webflux/src/main/java/org/springframework/web/reactive/handler/AbstractUrlHandlerMapping.java index 6273568d8f5..76d26750980 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/handler/AbstractUrlHandlerMapping.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/handler/AbstractUrlHandlerMapping.java @@ -186,7 +186,7 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping { * @param exchange current exchange */ @SuppressWarnings("UnusedParameters") - protected void validateHandler(Object handler, ServerWebExchange exchange) { + protected void validateHandler(@Nullable Object handler, ServerWebExchange exchange) { } /** diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/AbstractFileNameVersionStrategy.java b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/AbstractFileNameVersionStrategy.java index 7872195efd5..b3513f50a89 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/AbstractFileNameVersionStrategy.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/AbstractFileNameVersionStrategy.java @@ -22,6 +22,7 @@ import java.util.regex.Pattern; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; /** @@ -40,6 +41,7 @@ public abstract class AbstractFileNameVersionStrategy implements VersionStrategy @Override + @Nullable public String extractVersion(String requestPath) { Matcher matcher = pattern.matcher(requestPath); if (matcher.find()) { diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/AbstractPrefixVersionStrategy.java b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/AbstractPrefixVersionStrategy.java index a387e2766f6..a36bed15297 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/AbstractPrefixVersionStrategy.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/AbstractPrefixVersionStrategy.java @@ -19,6 +19,7 @@ package org.springframework.web.reactive.resource; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -44,6 +45,7 @@ public abstract class AbstractPrefixVersionStrategy implements VersionStrategy { @Override + @Nullable public String extractVersion(String requestPath) { return (requestPath.startsWith(this.prefix) ? this.prefix : null); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/AbstractHandlerMethodMapping.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/AbstractHandlerMethodMapping.java index bc5c8126b75..a42cbdc9536 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/AbstractHandlerMethodMapping.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/AbstractHandlerMethodMapping.java @@ -400,6 +400,7 @@ public abstract class AbstractHandlerMethodMapping extends AbstractHandlerMap } @Override + @Nullable protected CorsConfiguration getCorsConfiguration(Object handler, ServerWebExchange exchange) { CorsConfiguration corsConfig = super.getCorsConfiguration(handler, exchange); if (handler instanceof HandlerMethod handlerMethod) { diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfoHandlerMapping.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfoHandlerMapping.java index 99fc0518e7a..94d0cf9cfc3 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfoHandlerMapping.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfoHandlerMapping.java @@ -36,6 +36,7 @@ import org.springframework.http.MediaType; import org.springframework.http.server.PathContainer; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.observation.ServerRequestObservationContext; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.MultiValueMap; @@ -87,6 +88,7 @@ public abstract class RequestMappingInfoHandlerMapping extends AbstractHandlerMe * @return an info in case of a match; or {@code null} otherwise. */ @Override + @Nullable protected RequestMappingInfo getMatchingMapping(RequestMappingInfo info, ServerWebExchange exchange) { return info.getMatchingCondition(exchange); } @@ -171,6 +173,7 @@ public abstract class RequestMappingInfoHandlerMapping extends AbstractHandlerMe * method but not by query parameter conditions */ @Override + @Nullable protected HandlerMethod handleNoMatch(Set infos, ServerWebExchange exchange) throws Exception { diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/CookieValueMethodArgumentResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/CookieValueMethodArgumentResolver.java index 253d2af52fa..75c84dee3a1 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/CookieValueMethodArgumentResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/CookieValueMethodArgumentResolver.java @@ -65,6 +65,7 @@ public class CookieValueMethodArgumentResolver extends AbstractNamedValueSyncArg } @Override + @Nullable protected Object resolveNamedValue(String name, MethodParameter parameter, ServerWebExchange exchange) { HttpCookie cookie = exchange.getRequest().getCookies().getFirst(name); Class paramType = parameter.getNestedParameterType(); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ExpressionValueMethodArgumentResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ExpressionValueMethodArgumentResolver.java index 04c768b5b0b..1355c525755 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ExpressionValueMethodArgumentResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ExpressionValueMethodArgumentResolver.java @@ -63,6 +63,7 @@ public class ExpressionValueMethodArgumentResolver extends AbstractNamedValueSyn } @Override + @Nullable protected Object resolveNamedValue(String name, MethodParameter parameter, ServerWebExchange exchange) { // No name to resolve return null; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/PathVariableMethodArgumentResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/PathVariableMethodArgumentResolver.java index 2d53ad24c31..c3c493ebe98 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/PathVariableMethodArgumentResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/PathVariableMethodArgumentResolver.java @@ -85,6 +85,7 @@ public class PathVariableMethodArgumentResolver extends AbstractNamedValueSyncAr } @Override + @Nullable protected Object resolveNamedValue(String name, MethodParameter parameter, ServerWebExchange exchange) { String attributeName = HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE; return exchange.getAttributeOrDefault(attributeName, Collections.emptyMap()).get(name); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestHeaderMethodArgumentResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestHeaderMethodArgumentResolver.java index 6b45326bee9..5a2250c8d0b 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestHeaderMethodArgumentResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestHeaderMethodArgumentResolver.java @@ -78,6 +78,7 @@ public class RequestHeaderMethodArgumentResolver extends AbstractNamedValueSyncA } @Override + @Nullable protected Object resolveNamedValue(String name, MethodParameter parameter, ServerWebExchange exchange) { List headerValues = exchange.getRequest().getHeaders().get(name); Object result = null; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerMapping.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerMapping.java index 0196a47b749..213f6b41788 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerMapping.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerMapping.java @@ -356,6 +356,7 @@ public class RequestMappingHandlerMapping extends RequestMappingInfoHandlerMappi } @Override + @Nullable protected CorsConfiguration initCorsConfiguration(Object handler, Method method, RequestMappingInfo mappingInfo) { HandlerMethod handlerMethod = createHandlerMethod(handler, method); Class beanType = handlerMethod.getBeanType(); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestParamMethodArgumentResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestParamMethodArgumentResolver.java index 2cb066640a9..55f4d62b37c 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestParamMethodArgumentResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestParamMethodArgumentResolver.java @@ -98,6 +98,7 @@ public class RequestParamMethodArgumentResolver extends AbstractNamedValueSyncAr } @Override + @Nullable protected Object resolveNamedValue(String name, MethodParameter parameter, ServerWebExchange exchange) { List paramValues = exchange.getRequest().getQueryParams().get(name); Object result = null;