diff --git a/spring-test/src/main/java/org/springframework/mock/http/server/reactive/MockServerHttpRequest.java b/spring-test/src/main/java/org/springframework/mock/http/server/reactive/MockServerHttpRequest.java index f3e10eca524..26c808d5252 100644 --- a/spring-test/src/main/java/org/springframework/mock/http/server/reactive/MockServerHttpRequest.java +++ b/spring-test/src/main/java/org/springframework/mock/http/server/reactive/MockServerHttpRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2025 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. @@ -119,7 +119,7 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest { * @param uriVars zero or more URI variables * @return the created builder */ - public static BaseBuilder get(String urlTemplate, Object... uriVars) { + public static BaseBuilder get(String urlTemplate, @Nullable Object... uriVars) { return method(HttpMethod.GET, urlTemplate, uriVars); } @@ -129,7 +129,7 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest { * @param uriVars zero or more URI variables * @return the created builder */ - public static BaseBuilder head(String urlTemplate, Object... uriVars) { + public static BaseBuilder head(String urlTemplate, @Nullable Object... uriVars) { return method(HttpMethod.HEAD, urlTemplate, uriVars); } @@ -139,7 +139,7 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest { * @param uriVars zero or more URI variables * @return the created builder */ - public static BodyBuilder post(String urlTemplate, Object... uriVars) { + public static BodyBuilder post(String urlTemplate, @Nullable Object... uriVars) { return method(HttpMethod.POST, urlTemplate, uriVars); } @@ -150,7 +150,7 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest { * @param uriVars zero or more URI variables * @return the created builder */ - public static BodyBuilder put(String urlTemplate, Object... uriVars) { + public static BodyBuilder put(String urlTemplate, @Nullable Object... uriVars) { return method(HttpMethod.PUT, urlTemplate, uriVars); } @@ -160,7 +160,7 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest { * @param uriVars zero or more URI variables * @return the created builder */ - public static BodyBuilder patch(String urlTemplate, Object... uriVars) { + public static BodyBuilder patch(String urlTemplate, @Nullable Object... uriVars) { return method(HttpMethod.PATCH, urlTemplate, uriVars); } @@ -170,7 +170,7 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest { * @param uriVars zero or more URI variables * @return the created builder */ - public static BaseBuilder delete(String urlTemplate, Object... uriVars) { + public static BaseBuilder delete(String urlTemplate, @Nullable Object... uriVars) { return method(HttpMethod.DELETE, urlTemplate, uriVars); } @@ -180,7 +180,7 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest { * @param uriVars zero or more URI variables * @return the created builder */ - public static BaseBuilder options(String urlTemplate, Object... uriVars) { + public static BaseBuilder options(String urlTemplate, @Nullable Object... uriVars) { return method(HttpMethod.OPTIONS, urlTemplate, uriVars); } @@ -205,7 +205,7 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest { * @param vars variables to expand into the template * @return the created builder */ - public static BodyBuilder method(HttpMethod method, String uri, Object... vars) { + public static BodyBuilder method(HttpMethod method, String uri, @Nullable Object... vars) { return method(method, toUri(uri, vars)); } @@ -220,12 +220,12 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest { * @deprecated as of Spring Framework 6.0 in favor of {@link #method(HttpMethod, String, Object...)} */ @Deprecated(since = "6.0") - public static BodyBuilder method(String httpMethod, String uri, Object... vars) { + public static BodyBuilder method(String httpMethod, String uri, @Nullable Object... vars) { Assert.hasText(httpMethod, "HTTP method is required."); return new DefaultBodyBuilder(HttpMethod.valueOf(httpMethod), toUri(uri, vars)); } - private static URI toUri(String uri, Object[] vars) { + private static URI toUri(String uri, @Nullable Object[] vars) { return UriComponentsBuilder.fromUriString(uri).buildAndExpand(vars).encode().toUri(); } diff --git a/spring-test/src/main/java/org/springframework/test/web/UriAssert.java b/spring-test/src/main/java/org/springframework/test/web/UriAssert.java index 1373fc3c9b9..f532481f162 100644 --- a/spring-test/src/main/java/org/springframework/test/web/UriAssert.java +++ b/spring-test/src/main/java/org/springframework/test/web/UriAssert.java @@ -56,7 +56,7 @@ public class UriAssert extends AbstractStringAssert { * @param uriVars the values to replace the URI template variables * @see UriComponentsBuilder#buildAndExpand(Object...) */ - public UriAssert isEqualToTemplate(String uriTemplate, Object... uriVars) { + public UriAssert isEqualToTemplate(String uriTemplate, @Nullable Object... uriVars) { String uri = buildUri(uriTemplate, uriVars); return isEqualTo(uri); } @@ -81,7 +81,7 @@ public class UriAssert extends AbstractStringAssert { } - private String buildUri(String uriTemplate, Object... uriVars) { + private String buildUri(String uriTemplate, @Nullable Object... uriVars) { try { return UriComponentsBuilder.fromUriString(uriTemplate) .buildAndExpand(uriVars).encode().toUriString(); diff --git a/spring-test/src/main/java/org/springframework/test/web/client/match/MockRestRequestMatchers.java b/spring-test/src/main/java/org/springframework/test/web/client/match/MockRestRequestMatchers.java index a7397f039aa..8a72d2b99db 100644 --- a/spring-test/src/main/java/org/springframework/test/web/client/match/MockRestRequestMatchers.java +++ b/spring-test/src/main/java/org/springframework/test/web/client/match/MockRestRequestMatchers.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2025 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. @@ -23,6 +23,7 @@ import java.util.Map; import javax.xml.xpath.XPathExpressionException; import org.hamcrest.Matcher; +import org.jspecify.annotations.Nullable; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; @@ -98,7 +99,7 @@ public abstract class MockRestRequestMatchers { * @param uriVars zero or more URI variables to populate the expected URI * @return the request matcher */ - public static RequestMatcher requestToUriTemplate(String expectedUri, Object... uriVars) { + public static RequestMatcher requestToUriTemplate(String expectedUri, @Nullable Object... uriVars) { Assert.notNull(expectedUri, "'uri' must not be null"); URI uri = UriComponentsBuilder.fromUriString(expectedUri).buildAndExpand(uriVars).encode().toUri(); return requestTo(uri); diff --git a/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java b/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java index 7636b9b36b6..5c004fb39ca 100644 --- a/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java +++ b/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 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. @@ -202,13 +202,13 @@ class DefaultWebTestClient implements WebTestClient { } @Override - public RequestBodySpec uri(String uriTemplate, Object... uriVariables) { + public RequestBodySpec uri(String uriTemplate, @Nullable Object... uriVariables) { this.uriTemplate = uriTemplate; return uri(DefaultWebTestClient.this.uriBuilderFactory.expand(uriTemplate, uriVariables)); } @Override - public RequestBodySpec uri(String uriTemplate, Map uriVariables) { + public RequestBodySpec uri(String uriTemplate, Map uriVariables) { this.uriTemplate = uriTemplate; return uri(DefaultWebTestClient.this.uriBuilderFactory.expand(uriTemplate, uriVariables)); } diff --git a/spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java b/spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java index 22aedbfde0f..21852defea4 100644 --- a/spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java +++ b/spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java @@ -557,7 +557,7 @@ public interface WebTestClient { * with a base URI) it will be used to expand the URI template. * @return spec to add headers or perform the exchange */ - S uri(String uri, Object... uriVariables); + S uri(String uri, @Nullable Object... uriVariables); /** * Specify the URI for the request using a URI template and URI variables. @@ -565,7 +565,7 @@ public interface WebTestClient { * with a base URI) it will be used to expand the URI template. * @return spec to add headers or perform the exchange */ - S uri(String uri, Map uriVariables); + S uri(String uri, Map uriVariables); /** * Build the URI for the request with a {@link UriBuilder} obtained diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/request/AbstractMockHttpServletRequestBuilder.java b/spring-test/src/main/java/org/springframework/test/web/servlet/request/AbstractMockHttpServletRequestBuilder.java index 44e45bdfbe8..94c17cdd5e1 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/request/AbstractMockHttpServletRequestBuilder.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/request/AbstractMockHttpServletRequestBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 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. @@ -151,7 +151,7 @@ public abstract class AbstractMockHttpServletRequestBuilder "'uri' should start with a path or be a complete HTTP URI: " + uri); diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/request/MockHttpServletRequestBuilder.java b/spring-test/src/main/java/org/springframework/test/web/servlet/request/MockHttpServletRequestBuilder.java index a07eadbee66..b4944fa5c73 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/request/MockHttpServletRequestBuilder.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/request/MockHttpServletRequestBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 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. @@ -75,7 +75,7 @@ public class MockHttpServletRequestBuilder } @Override - public MockHttpServletRequestBuilder uri(String uriTemplate, Object... uriVariables) { + public MockHttpServletRequestBuilder uri(String uriTemplate, @Nullable Object... uriVariables) { return super.uri(uriTemplate, uriVariables); } diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/request/MockMvcRequestBuilders.java b/spring-test/src/main/java/org/springframework/test/web/servlet/request/MockMvcRequestBuilders.java index 00c0c54ceb2..abf47939109 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/request/MockMvcRequestBuilders.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/request/MockMvcRequestBuilders.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 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. @@ -19,6 +19,7 @@ package org.springframework.test.web.servlet.request; import java.net.URI; import jakarta.servlet.DispatcherType; +import org.jspecify.annotations.Nullable; import org.springframework.http.HttpMethod; import org.springframework.mock.web.MockHttpServletRequest; @@ -52,7 +53,7 @@ public abstract class MockMvcRequestBuilders { * @param uriTemplate a URI template; the resulting URI will be encoded * @param uriVariables zero or more URI variables */ - public static MockHttpServletRequestBuilder get(String uriTemplate, Object... uriVariables) { + public static MockHttpServletRequestBuilder get(String uriTemplate, @Nullable Object... uriVariables) { return new MockHttpServletRequestBuilder(HttpMethod.GET).uri(uriTemplate, uriVariables); } @@ -70,7 +71,7 @@ public abstract class MockMvcRequestBuilders { * @param uriTemplate a URI template; the resulting URI will be encoded * @param uriVariables zero or more URI variables */ - public static MockHttpServletRequestBuilder post(String uriTemplate, Object... uriVariables) { + public static MockHttpServletRequestBuilder post(String uriTemplate, @Nullable Object... uriVariables) { return new MockHttpServletRequestBuilder(HttpMethod.POST).uri(uriTemplate, uriVariables); } @@ -88,7 +89,7 @@ public abstract class MockMvcRequestBuilders { * @param uriTemplate a URI template; the resulting URI will be encoded * @param uriVariables zero or more URI variables */ - public static MockHttpServletRequestBuilder put(String uriTemplate, Object... uriVariables) { + public static MockHttpServletRequestBuilder put(String uriTemplate, @Nullable Object... uriVariables) { return new MockHttpServletRequestBuilder(HttpMethod.PUT).uri(uriTemplate, uriVariables); } @@ -106,7 +107,7 @@ public abstract class MockMvcRequestBuilders { * @param uriTemplate a URI template; the resulting URI will be encoded * @param uriVariables zero or more URI variables */ - public static MockHttpServletRequestBuilder patch(String uriTemplate, Object... uriVariables) { + public static MockHttpServletRequestBuilder patch(String uriTemplate,@Nullable Object... uriVariables) { return new MockHttpServletRequestBuilder(HttpMethod.PATCH).uri(uriTemplate, uriVariables); } @@ -124,7 +125,7 @@ public abstract class MockMvcRequestBuilders { * @param uriTemplate a URI template; the resulting URI will be encoded * @param uriVariables zero or more URI variables */ - public static MockHttpServletRequestBuilder delete(String uriTemplate, Object... uriVariables) { + public static MockHttpServletRequestBuilder delete(String uriTemplate, @Nullable Object... uriVariables) { return new MockHttpServletRequestBuilder(HttpMethod.DELETE).uri(uriTemplate, uriVariables); } @@ -142,7 +143,7 @@ public abstract class MockMvcRequestBuilders { * @param uriTemplate a URI template; the resulting URI will be encoded * @param uriVariables zero or more URI variables */ - public static MockHttpServletRequestBuilder options(String uriTemplate, Object... uriVariables) { + public static MockHttpServletRequestBuilder options(String uriTemplate, @Nullable Object... uriVariables) { return new MockHttpServletRequestBuilder(HttpMethod.OPTIONS).uri(uriTemplate, uriVariables); } @@ -161,7 +162,7 @@ public abstract class MockMvcRequestBuilders { * @param uriVariables zero or more URI variables * @since 4.1 */ - public static MockHttpServletRequestBuilder head(String uriTemplate, Object... uriVariables) { + public static MockHttpServletRequestBuilder head(String uriTemplate, @Nullable Object... uriVariables) { return new MockHttpServletRequestBuilder(HttpMethod.HEAD).uri(uriTemplate, uriVariables); } @@ -180,7 +181,7 @@ public abstract class MockMvcRequestBuilders { * @param uriTemplate a URI template; the resulting URI will be encoded * @param uriVariables zero or more URI variables */ - public static MockHttpServletRequestBuilder request(HttpMethod method, String uriTemplate, Object... uriVariables) { + public static MockHttpServletRequestBuilder request(HttpMethod method, String uriTemplate, @Nullable Object... uriVariables) { return new MockHttpServletRequestBuilder(method).uri(uriTemplate, uriVariables); } @@ -213,7 +214,7 @@ public abstract class MockMvcRequestBuilders { * @param uriVariables zero or more URI variables * @since 5.0 */ - public static MockMultipartHttpServletRequestBuilder multipart(String uriTemplate, Object... uriVariables) { + public static MockMultipartHttpServletRequestBuilder multipart(String uriTemplate, @Nullable Object... uriVariables) { MockMultipartHttpServletRequestBuilder builder = new MockMultipartHttpServletRequestBuilder(); builder.uri(uriTemplate, uriVariables); return builder; @@ -227,7 +228,7 @@ public abstract class MockMvcRequestBuilders { * @param uriVariables zero or more URI variables * @since 5.3.22 */ - public static MockMultipartHttpServletRequestBuilder multipart(HttpMethod httpMethod, String uriTemplate, Object... uriVariables) { + public static MockMultipartHttpServletRequestBuilder multipart(HttpMethod httpMethod, String uriTemplate, @Nullable Object... uriVariables) { MockMultipartHttpServletRequestBuilder builder = new MockMultipartHttpServletRequestBuilder(httpMethod); builder.uri(uriTemplate, uriVariables); return builder; diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/result/MockMvcResultMatchers.java b/spring-test/src/main/java/org/springframework/test/web/servlet/result/MockMvcResultMatchers.java index a5cc5e036a2..7c800058e2e 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/result/MockMvcResultMatchers.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/result/MockMvcResultMatchers.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2025 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. @@ -98,7 +98,7 @@ public abstract class MockMvcResultMatchers { * @param uriVars zero or more URI variables to populate the template * @see UriComponentsBuilder#fromUriString(String) */ - public static ResultMatcher forwardedUrlTemplate(String urlTemplate, Object... uriVars) { + public static ResultMatcher forwardedUrlTemplate(String urlTemplate, @Nullable Object... uriVars) { String uri = UriComponentsBuilder.fromUriString(urlTemplate).buildAndExpand(uriVars).encode().toUriString(); return forwardedUrl(uri); } @@ -137,7 +137,7 @@ public abstract class MockMvcResultMatchers { * @param uriVars zero or more URI variables to populate the template * @see UriComponentsBuilder#fromUriString(String) */ - public static ResultMatcher redirectedUrlTemplate(String urlTemplate, Object... uriVars) { + public static ResultMatcher redirectedUrlTemplate(String urlTemplate, @Nullable Object... uriVars) { String uri = UriComponentsBuilder.fromUriString(urlTemplate).buildAndExpand(uriVars).encode().toUriString(); return redirectedUrl(uri); } diff --git a/spring-web/src/main/java/org/springframework/http/RequestEntity.java b/spring-web/src/main/java/org/springframework/http/RequestEntity.java index 2f15ff57c7c..bcbac6914ad 100644 --- a/spring-web/src/main/java/org/springframework/http/RequestEntity.java +++ b/spring-web/src/main/java/org/springframework/http/RequestEntity.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2025 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. @@ -304,7 +304,7 @@ public class RequestEntity extends HttpEntity { * @return the created builder * @since 5.3 */ - public static BodyBuilder method(HttpMethod method, String uriTemplate, Object... uriVariables) { + public static BodyBuilder method(HttpMethod method, String uriTemplate, @Nullable Object... uriVariables) { return new DefaultBodyBuilder(method, uriTemplate, uriVariables); } @@ -336,7 +336,7 @@ public class RequestEntity extends HttpEntity { * @return the created builder * @since 5.3 */ - public static HeadersBuilder get(String uriTemplate, Object... uriVariables) { + public static HeadersBuilder get(String uriTemplate, @Nullable Object... uriVariables) { return method(HttpMethod.GET, uriTemplate, uriVariables); } @@ -356,7 +356,7 @@ public class RequestEntity extends HttpEntity { * @return the created builder * @since 5.3 */ - public static HeadersBuilder head(String uriTemplate, Object... uriVariables) { + public static HeadersBuilder head(String uriTemplate, @Nullable Object... uriVariables) { return method(HttpMethod.HEAD, uriTemplate, uriVariables); } @@ -376,7 +376,7 @@ public class RequestEntity extends HttpEntity { * @return the created builder * @since 5.3 */ - public static BodyBuilder post(String uriTemplate, Object... uriVariables) { + public static BodyBuilder post(String uriTemplate, @Nullable Object... uriVariables) { return method(HttpMethod.POST, uriTemplate, uriVariables); } @@ -396,7 +396,7 @@ public class RequestEntity extends HttpEntity { * @return the created builder * @since 5.3 */ - public static BodyBuilder put(String uriTemplate, Object... uriVariables) { + public static BodyBuilder put(String uriTemplate, @Nullable Object... uriVariables) { return method(HttpMethod.PUT, uriTemplate, uriVariables); } @@ -416,7 +416,7 @@ public class RequestEntity extends HttpEntity { * @return the created builder * @since 5.3 */ - public static BodyBuilder patch(String uriTemplate, Object... uriVariables) { + public static BodyBuilder patch(String uriTemplate, @Nullable Object... uriVariables) { return method(HttpMethod.PATCH, uriTemplate, uriVariables); } @@ -436,7 +436,7 @@ public class RequestEntity extends HttpEntity { * @return the created builder * @since 5.3 */ - public static HeadersBuilder delete(String uriTemplate, Object... uriVariables) { + public static HeadersBuilder delete(String uriTemplate, @Nullable Object... uriVariables) { return method(HttpMethod.DELETE, uriTemplate, uriVariables); } @@ -456,7 +456,7 @@ public class RequestEntity extends HttpEntity { * @return the created builder * @since 5.3 */ - public static HeadersBuilder options(String uriTemplate, Object... uriVariables) { + public static HeadersBuilder options(String uriTemplate, @Nullable Object... uriVariables) { return method(HttpMethod.OPTIONS, uriTemplate, uriVariables); } @@ -601,9 +601,9 @@ public class RequestEntity extends HttpEntity { private final @Nullable String uriTemplate; - private final Object @Nullable [] uriVarsArray; + private final @Nullable Object @Nullable [] uriVarsArray; - private final @Nullable Map uriVarsMap; + private final @Nullable Map uriVarsMap; DefaultBodyBuilder(HttpMethod method, URI url) { this.method = method; @@ -613,7 +613,7 @@ public class RequestEntity extends HttpEntity { this.uriVarsMap = null; } - DefaultBodyBuilder(HttpMethod method, String uriTemplate, Object... uriVars) { + DefaultBodyBuilder(HttpMethod method, String uriTemplate, @Nullable Object... uriVars) { this.method = method; this.uri = null; this.uriTemplate = uriTemplate; @@ -621,7 +621,7 @@ public class RequestEntity extends HttpEntity { this.uriVarsMap = null; } - DefaultBodyBuilder(HttpMethod method, String uriTemplate, Map uriVars) { + DefaultBodyBuilder(HttpMethod method, String uriTemplate, Map uriVars) { this.method = method; this.uri = null; this.uriTemplate = uriTemplate; diff --git a/spring-web/src/main/java/org/springframework/web/client/DefaultRestClient.java b/spring-web/src/main/java/org/springframework/web/client/DefaultRestClient.java index 0c0a70ef740..c1244a75478 100644 --- a/spring-web/src/main/java/org/springframework/web/client/DefaultRestClient.java +++ b/spring-web/src/main/java/org/springframework/web/client/DefaultRestClient.java @@ -305,7 +305,7 @@ final class DefaultRestClient implements RestClient { } @Override - public RequestBodySpec uri(String uriTemplate, Object... uriVariables) { + public RequestBodySpec uri(String uriTemplate, @Nullable Object... uriVariables) { UriBuilder uriBuilder = uriBuilderFactory.uriString(uriTemplate); attribute(URI_TEMPLATE_ATTRIBUTE, uriBuilder.toUriString()); return uri(DefaultRestClient.this.uriBuilderFactory.expand(uriTemplate, uriVariables)); diff --git a/spring-web/src/main/java/org/springframework/web/client/RestClient.java b/spring-web/src/main/java/org/springframework/web/client/RestClient.java index be5b21fcd4e..391ab01c1ee 100644 --- a/spring-web/src/main/java/org/springframework/web/client/RestClient.java +++ b/spring-web/src/main/java/org/springframework/web/client/RestClient.java @@ -503,14 +503,14 @@ public interface RestClient { *

If a {@link UriBuilderFactory} was configured for the client (for example, * with a base URI) it will be used to expand the URI template. */ - S uri(String uri, Object... uriVariables); + S uri(String uri, @Nullable Object... uriVariables); /** * Specify the URI for the request using a URI template and URI variables. *

If a {@link UriBuilderFactory} was configured for the client (for example, * with a base URI) it will be used to expand the URI template. */ - S uri(String uri, Map uriVariables); + S uri(String uri, Map uriVariables); /** * Specify the URI starting with a URI template and finishing off with a diff --git a/spring-web/src/main/java/org/springframework/web/client/RestOperations.java b/spring-web/src/main/java/org/springframework/web/client/RestOperations.java index bcdb4214cec..4f1132cc0eb 100644 --- a/spring-web/src/main/java/org/springframework/web/client/RestOperations.java +++ b/spring-web/src/main/java/org/springframework/web/client/RestOperations.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 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. @@ -53,7 +53,7 @@ public interface RestOperations { * @param uriVariables the variables to expand the template * @return the converted object */ - @Nullable T getForObject(String url, Class responseType, Object... uriVariables) throws RestClientException; + @Nullable T getForObject(String url, Class responseType, @Nullable Object... uriVariables) throws RestClientException; /** * Retrieve a representation by doing a GET on the URI template. @@ -64,7 +64,7 @@ public interface RestOperations { * @param uriVariables the map containing variables for the URI template * @return the converted object */ - @Nullable T getForObject(String url, Class responseType, Map uriVariables) throws RestClientException; + @Nullable T getForObject(String url, Class responseType, Map uriVariables) throws RestClientException; /** * Retrieve a representation by doing a GET on the URL. @@ -85,7 +85,7 @@ public interface RestOperations { * @return the entity * @since 3.0.2 */ - ResponseEntity getForEntity(String url, Class responseType, Object... uriVariables) + ResponseEntity getForEntity(String url, Class responseType, @Nullable Object... uriVariables) throws RestClientException; /** @@ -98,7 +98,7 @@ public interface RestOperations { * @return the converted object * @since 3.0.2 */ - ResponseEntity getForEntity(String url, Class responseType, Map uriVariables) + ResponseEntity getForEntity(String url, Class responseType, Map uriVariables) throws RestClientException; /** @@ -121,7 +121,7 @@ public interface RestOperations { * @param uriVariables the variables to expand the template * @return all HTTP headers of that resource */ - HttpHeaders headForHeaders(String url, Object... uriVariables) throws RestClientException; + HttpHeaders headForHeaders(String url, @Nullable Object... uriVariables) throws RestClientException; /** * Retrieve all headers of the resource specified by the URI template. @@ -130,7 +130,7 @@ public interface RestOperations { * @param uriVariables the map containing variables for the URI template * @return all HTTP headers of that resource */ - HttpHeaders headForHeaders(String url, Map uriVariables) throws RestClientException; + HttpHeaders headForHeaders(String url, Map uriVariables) throws RestClientException; /** * Retrieve all headers of the resource specified by the URL. @@ -159,7 +159,7 @@ public interface RestOperations { * @return the value for the {@code Location} header * @see HttpEntity */ - @Nullable URI postForLocation(String url, @Nullable Object request, Object... uriVariables) throws RestClientException; + @Nullable URI postForLocation(String url, @Nullable Object request, @Nullable Object... uriVariables) throws RestClientException; /** * Create a new resource by POSTing the given object to the URI template, and return the value of @@ -178,7 +178,7 @@ public interface RestOperations { * @return the value for the {@code Location} header * @see HttpEntity */ - @Nullable URI postForLocation(String url, @Nullable Object request, Map uriVariables) + @Nullable URI postForLocation(String url, @Nullable Object request, Map uriVariables) throws RestClientException; /** @@ -217,7 +217,7 @@ public interface RestOperations { * @see HttpEntity */ @Nullable T postForObject(String url, @Nullable Object request, Class responseType, - Object... uriVariables) throws RestClientException; + @Nullable Object... uriVariables) throws RestClientException; /** * Create a new resource by POSTing the given object to the URI template, @@ -238,7 +238,7 @@ public interface RestOperations { * @see HttpEntity */ @Nullable T postForObject(String url, @Nullable Object request, Class responseType, - Map uriVariables) throws RestClientException; + Map uriVariables) throws RestClientException; /** * Create a new resource by POSTing the given object to the URL, @@ -277,7 +277,7 @@ public interface RestOperations { * @see HttpEntity */ ResponseEntity postForEntity(String url, @Nullable Object request, Class responseType, - Object... uriVariables) throws RestClientException; + @Nullable Object... uriVariables) throws RestClientException; /** * Create a new resource by POSTing the given object to the URI template, @@ -298,7 +298,7 @@ public interface RestOperations { * @see HttpEntity */ ResponseEntity postForEntity(String url, @Nullable Object request, Class responseType, - Map uriVariables) throws RestClientException; + Map uriVariables) throws RestClientException; /** * Create a new resource by POSTing the given object to the URL, @@ -332,7 +332,7 @@ public interface RestOperations { * @param uriVariables the variables to expand the template * @see HttpEntity */ - void put(String url, @Nullable Object request, Object... uriVariables) throws RestClientException; + void put(String url, @Nullable Object request, @Nullable Object... uriVariables) throws RestClientException; /** * Creates a new resource by PUTting the given object to URI template. @@ -344,7 +344,7 @@ public interface RestOperations { * @param uriVariables the variables to expand the template * @see HttpEntity */ - void put(String url, @Nullable Object request, Map uriVariables) throws RestClientException; + void put(String url, @Nullable Object request, Map uriVariables) throws RestClientException; /** * Creates a new resource by PUTting the given object to URL. @@ -377,7 +377,7 @@ public interface RestOperations { * @see RestTemplate#setRequestFactory * @see org.springframework.http.client.HttpComponentsClientHttpRequestFactory */ - @Nullable T patchForObject(String url, @Nullable Object request, Class responseType, Object... uriVariables) + @Nullable T patchForObject(String url, @Nullable Object request, Class responseType, @Nullable Object... uriVariables) throws RestClientException; /** @@ -399,7 +399,7 @@ public interface RestOperations { * @see org.springframework.http.client.HttpComponentsClientHttpRequestFactory */ @Nullable T patchForObject(String url, @Nullable Object request, Class responseType, - Map uriVariables) throws RestClientException; + Map uriVariables) throws RestClientException; /** * Update a resource by PATCHing the given object to the URL, @@ -430,7 +430,7 @@ public interface RestOperations { * @param url the URL * @param uriVariables the variables to expand in the template */ - void delete(String url, Object... uriVariables) throws RestClientException; + void delete(String url, @Nullable Object... uriVariables) throws RestClientException; /** * Delete the resources at the specified URI. @@ -438,7 +438,7 @@ public interface RestOperations { * @param url the URL * @param uriVariables the variables to expand the template */ - void delete(String url, Map uriVariables) throws RestClientException; + void delete(String url, Map uriVariables) throws RestClientException; /** * Delete the resources at the specified URL. @@ -456,7 +456,7 @@ public interface RestOperations { * @param uriVariables the variables to expand in the template * @return the value of the {@code Allow} header */ - Set optionsForAllow(String url, Object... uriVariables) throws RestClientException; + Set optionsForAllow(String url, @Nullable Object... uriVariables) throws RestClientException; /** * Return the value of the {@code Allow} header for the given URI. @@ -465,7 +465,7 @@ public interface RestOperations { * @param uriVariables the variables to expand in the template * @return the value of the {@code Allow} header */ - Set optionsForAllow(String url, Map uriVariables) throws RestClientException; + Set optionsForAllow(String url, Map uriVariables) throws RestClientException; /** * Return the value of the {@code Allow} header for the given URL. @@ -491,7 +491,7 @@ public interface RestOperations { * @since 3.0.2 */ ResponseEntity exchange(String url, HttpMethod method, @Nullable HttpEntity requestEntity, - Class responseType, Object... uriVariables) throws RestClientException; + Class responseType, @Nullable Object... uriVariables) throws RestClientException; /** * Execute the HTTP method to the given URI template, writing the given request entity to the request, @@ -507,7 +507,7 @@ public interface RestOperations { * @since 3.0.2 */ ResponseEntity exchange(String url, HttpMethod method, @Nullable HttpEntity requestEntity, - Class responseType, Map uriVariables) throws RestClientException; + Class responseType, Map uriVariables) throws RestClientException; /** * Execute the HTTP method to the given URI template, writing the given request entity to the request, @@ -544,7 +544,7 @@ public interface RestOperations { * @since 3.2 */ ResponseEntity exchange(String url,HttpMethod method, @Nullable HttpEntity requestEntity, - ParameterizedTypeReference responseType, Object... uriVariables) throws RestClientException; + ParameterizedTypeReference responseType, @Nullable Object... uriVariables) throws RestClientException; /** * Execute the HTTP method to the given URI template, writing the given @@ -567,7 +567,7 @@ public interface RestOperations { * @since 3.2 */ ResponseEntity exchange(String url, HttpMethod method, @Nullable HttpEntity requestEntity, - ParameterizedTypeReference responseType, Map uriVariables) throws RestClientException; + ParameterizedTypeReference responseType, Map uriVariables) throws RestClientException; /** * Execute the HTTP method to the given URI template, writing the given @@ -648,7 +648,7 @@ public interface RestOperations { * @return an arbitrary object, as returned by the {@link ResponseExtractor} */ @Nullable T execute(String uriTemplate, HttpMethod method, @Nullable RequestCallback requestCallback, - @Nullable ResponseExtractor responseExtractor, Object... uriVariables) + @Nullable ResponseExtractor responseExtractor, @Nullable Object... uriVariables) throws RestClientException; /** @@ -663,7 +663,7 @@ public interface RestOperations { * @return an arbitrary object, as returned by the {@link ResponseExtractor} */ @Nullable T execute(String uriTemplate, HttpMethod method, @Nullable RequestCallback requestCallback, - @Nullable ResponseExtractor responseExtractor, Map uriVariables) + @Nullable ResponseExtractor responseExtractor, Map uriVariables) throws RestClientException; /** diff --git a/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java b/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java index 6f7b992bdba..0bd298014ab 100644 --- a/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java +++ b/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java @@ -330,7 +330,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat * @param uriVars the default URI variable values * @since 4.3 */ - public void setDefaultUriVariables(Map uriVars) { + public void setDefaultUriVariables(Map uriVars) { if (this.uriTemplateHandler instanceof DefaultUriBuilderFactory factory) { factory.setDefaultUriVariables(uriVars); } @@ -405,7 +405,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat // GET @Override - public @Nullable T getForObject(String url, Class responseType, Object... uriVariables) throws RestClientException { + public @Nullable T getForObject(String url, Class responseType, @Nullable Object... uriVariables) throws RestClientException { RequestCallback requestCallback = acceptHeaderRequestCallback(responseType); HttpMessageConverterExtractor responseExtractor = new HttpMessageConverterExtractor<>(responseType, getMessageConverters(), logger); @@ -429,7 +429,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat } @Override - public ResponseEntity getForEntity(String url, Class responseType, Object... uriVariables) + public ResponseEntity getForEntity(String url, Class responseType, @Nullable Object... uriVariables) throws RestClientException { RequestCallback requestCallback = acceptHeaderRequestCallback(responseType); @@ -438,7 +438,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat } @Override - public ResponseEntity getForEntity(String url, Class responseType, Map uriVariables) + public ResponseEntity getForEntity(String url, Class responseType, Map uriVariables) throws RestClientException { RequestCallback requestCallback = acceptHeaderRequestCallback(responseType); @@ -457,12 +457,12 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat // HEAD @Override - public HttpHeaders headForHeaders(String url, Object... uriVariables) throws RestClientException { + public HttpHeaders headForHeaders(String url, @Nullable Object... uriVariables) throws RestClientException { return nonNull(execute(url, HttpMethod.HEAD, null, headersExtractor(), uriVariables)); } @Override - public HttpHeaders headForHeaders(String url, Map uriVariables) throws RestClientException { + public HttpHeaders headForHeaders(String url, Map uriVariables) throws RestClientException { return nonNull(execute(url, HttpMethod.HEAD, null, headersExtractor(), uriVariables)); } @@ -475,7 +475,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat // POST @Override - public @Nullable URI postForLocation(String url, @Nullable Object request, Object... uriVariables) + public @Nullable URI postForLocation(String url, @Nullable Object request, @Nullable Object... uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request); @@ -484,7 +484,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat } @Override - public @Nullable URI postForLocation(String url, @Nullable Object request, Map uriVariables) + public @Nullable URI postForLocation(String url, @Nullable Object request, Map uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request); @@ -501,7 +501,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat @Override public @Nullable T postForObject(String url, @Nullable Object request, Class responseType, - Object... uriVariables) throws RestClientException { + @Nullable Object... uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request, responseType); HttpMessageConverterExtractor responseExtractor = @@ -511,7 +511,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat @Override public @Nullable T postForObject(String url, @Nullable Object request, Class responseType, - Map uriVariables) throws RestClientException { + Map uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request, responseType); HttpMessageConverterExtractor responseExtractor = @@ -531,7 +531,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat @Override public ResponseEntity postForEntity(String url, @Nullable Object request, - Class responseType, Object... uriVariables) throws RestClientException { + Class responseType, @Nullable Object... uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request, responseType); ResponseExtractor> responseExtractor = responseEntityExtractor(responseType); @@ -540,7 +540,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat @Override public ResponseEntity postForEntity(String url, @Nullable Object request, - Class responseType, Map uriVariables) throws RestClientException { + Class responseType, Map uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request, responseType); ResponseExtractor> responseExtractor = responseEntityExtractor(responseType); @@ -560,7 +560,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat // PUT @Override - public void put(String url, @Nullable Object request, Object... uriVariables) + public void put(String url, @Nullable Object request, @Nullable Object... uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request); @@ -568,7 +568,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat } @Override - public void put(String url, @Nullable Object request, Map uriVariables) + public void put(String url, @Nullable Object request, Map uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request); @@ -586,7 +586,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat @Override public @Nullable T patchForObject(String url, @Nullable Object request, Class responseType, - Object... uriVariables) throws RestClientException { + @Nullable Object... uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request, responseType); HttpMessageConverterExtractor responseExtractor = @@ -596,7 +596,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat @Override public @Nullable T patchForObject(String url, @Nullable Object request, Class responseType, - Map uriVariables) throws RestClientException { + Map uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request, responseType); HttpMessageConverterExtractor responseExtractor = @@ -618,12 +618,12 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat // DELETE @Override - public void delete(String url, Object... uriVariables) throws RestClientException { + public void delete(String url, @Nullable Object... uriVariables) throws RestClientException { execute(url, HttpMethod.DELETE, null, null, uriVariables); } @Override - public void delete(String url, Map uriVariables) throws RestClientException { + public void delete(String url, Map uriVariables) throws RestClientException { execute(url, HttpMethod.DELETE, null, null, uriVariables); } @@ -636,14 +636,14 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat // OPTIONS @Override - public Set optionsForAllow(String url, Object... uriVariables) throws RestClientException { + public Set optionsForAllow(String url, @Nullable Object... uriVariables) throws RestClientException { ResponseExtractor headersExtractor = headersExtractor(); HttpHeaders headers = execute(url, HttpMethod.OPTIONS, null, headersExtractor, uriVariables); return (headers != null ? headers.getAllow() : Collections.emptySet()); } @Override - public Set optionsForAllow(String url, Map uriVariables) throws RestClientException { + public Set optionsForAllow(String url, Map uriVariables) throws RestClientException { ResponseExtractor headersExtractor = headersExtractor(); HttpHeaders headers = execute(url, HttpMethod.OPTIONS, null, headersExtractor, uriVariables); return (headers != null ? headers.getAllow() : Collections.emptySet()); @@ -661,7 +661,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat @Override public ResponseEntity exchange(String url, HttpMethod method, - @Nullable HttpEntity requestEntity, Class responseType, Object... uriVariables) + @Nullable HttpEntity requestEntity, Class responseType, @Nullable Object... uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(requestEntity, responseType); @@ -671,7 +671,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat @Override public ResponseEntity exchange(String url, HttpMethod method, - @Nullable HttpEntity requestEntity, Class responseType, Map uriVariables) + @Nullable HttpEntity requestEntity, Class responseType, Map uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(requestEntity, responseType); @@ -690,7 +690,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat @Override public ResponseEntity exchange(String url, HttpMethod method, @Nullable HttpEntity requestEntity, - ParameterizedTypeReference responseType, Object... uriVariables) throws RestClientException { + ParameterizedTypeReference responseType, @Nullable Object... uriVariables) throws RestClientException { Type type = responseType.getType(); RequestCallback requestCallback = httpEntityCallback(requestEntity, type); @@ -700,7 +700,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat @Override public ResponseEntity exchange(String url, HttpMethod method, @Nullable HttpEntity requestEntity, - ParameterizedTypeReference responseType, Map uriVariables) throws RestClientException { + ParameterizedTypeReference responseType, Map uriVariables) throws RestClientException { Type type = responseType.getType(); RequestCallback requestCallback = httpEntityCallback(requestEntity, type); @@ -779,7 +779,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat */ @Override public @Nullable T execute(String uriTemplate, HttpMethod method, @Nullable RequestCallback requestCallback, - @Nullable ResponseExtractor responseExtractor, Object... uriVariables) throws RestClientException { + @Nullable ResponseExtractor responseExtractor, @Nullable Object... uriVariables) throws RestClientException { URI url = getUriTemplateHandler().expand(uriTemplate, uriVariables); return doExecute(url, uriTemplate, method, requestCallback, responseExtractor); @@ -798,7 +798,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat */ @Override public @Nullable T execute(String uriTemplate, HttpMethod method, @Nullable RequestCallback requestCallback, - @Nullable ResponseExtractor responseExtractor, Map uriVariables) + @Nullable ResponseExtractor responseExtractor, Map uriVariables) throws RestClientException { URI url = getUriTemplateHandler().expand(uriTemplate, uriVariables); diff --git a/spring-web/src/main/java/org/springframework/web/util/DefaultUriBuilderFactory.java b/spring-web/src/main/java/org/springframework/web/util/DefaultUriBuilderFactory.java index b49830a0947..6302f8d176d 100644 --- a/spring-web/src/main/java/org/springframework/web/util/DefaultUriBuilderFactory.java +++ b/spring-web/src/main/java/org/springframework/web/util/DefaultUriBuilderFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 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. @@ -49,7 +49,7 @@ public class DefaultUriBuilderFactory implements UriBuilderFactory { private EncodingMode encodingMode = EncodingMode.TEMPLATE_AND_VALUES; - private @Nullable Map defaultUriVariables; + private @Nullable Map defaultUriVariables; private boolean parsePath = true; @@ -140,7 +140,7 @@ public class DefaultUriBuilderFactory implements UriBuilderFactory { * with a Map of variables. * @param defaultUriVariables default URI variable values */ - public void setDefaultUriVariables(@Nullable Map defaultUriVariables) { + public void setDefaultUriVariables(@Nullable Map defaultUriVariables) { if (defaultUriVariables != null) { if (this.defaultUriVariables == null) { this.defaultUriVariables = new HashMap<>(defaultUriVariables); @@ -192,12 +192,12 @@ public class DefaultUriBuilderFactory implements UriBuilderFactory { // UriTemplateHandler @Override - public URI expand(String uriTemplate, Map uriVars) { + public URI expand(String uriTemplate, Map uriVars) { return uriString(uriTemplate).build(uriVars); } @Override - public URI expand(String uriTemplate, Object... uriVars) { + public URI expand(String uriTemplate, @Nullable Object... uriVars) { return uriString(uriTemplate).build(uriVars); } @@ -446,7 +446,7 @@ public class DefaultUriBuilderFactory implements UriBuilderFactory { } @Override - public URI build(Object... uriVars) { + public URI build(@Nullable Object... uriVars) { if (ObjectUtils.isEmpty(uriVars) && !CollectionUtils.isEmpty(defaultUriVariables)) { return build(Collections.emptyMap()); } diff --git a/spring-web/src/main/java/org/springframework/web/util/UriBuilder.java b/spring-web/src/main/java/org/springframework/web/util/UriBuilder.java index 238aca79bc8..3c36ed29f35 100644 --- a/spring-web/src/main/java/org/springframework/web/util/UriBuilder.java +++ b/spring-web/src/main/java/org/springframework/web/util/UriBuilder.java @@ -261,7 +261,7 @@ public interface UriBuilder { * @param uriVariables the map of URI variables * @return the URI */ - URI build(Object... uriVariables); + URI build(@Nullable Object... uriVariables); /** * Build a {@link URI} instance and replaces URI template variables @@ -269,7 +269,7 @@ public interface UriBuilder { * @param uriVariables the map of URI variables * @return the URI */ - URI build(Map uriVariables); + URI build(Map uriVariables); /** * Return a String representation of the URI by concatenating all URI diff --git a/spring-web/src/main/java/org/springframework/web/util/UriComponents.java b/spring-web/src/main/java/org/springframework/web/util/UriComponents.java index c8ae65a0ace..ee1e4bdc58c 100644 --- a/spring-web/src/main/java/org/springframework/web/util/UriComponents.java +++ b/spring-web/src/main/java/org/springframework/web/util/UriComponents.java @@ -148,7 +148,7 @@ public abstract class UriComponents implements Serializable { * @param uriVariables the map of URI variables * @return the expanded URI components */ - public final UriComponents expand(Map uriVariables) { + public final UriComponents expand(Map uriVariables) { Assert.notNull(uriVariables, "'uriVariables' must not be null"); return expandInternal(new MapTemplateVariables(uriVariables)); } @@ -159,7 +159,7 @@ public abstract class UriComponents implements Serializable { * @param uriVariableValues the URI variable values * @return the expanded URI components */ - public final UriComponents expand(Object... uriVariableValues) { + public final UriComponents expand(@Nullable Object... uriVariableValues) { Assert.notNull(uriVariableValues, "'uriVariableValues' must not be null"); return expandInternal(new VarArgsTemplateVariables(uriVariableValues)); } @@ -324,9 +324,9 @@ public abstract class UriComponents implements Serializable { */ private static class MapTemplateVariables implements UriTemplateVariables { - private final Map uriVariables; + private final Map uriVariables; - public MapTemplateVariables(Map uriVariables) { + public MapTemplateVariables(Map uriVariables) { this.uriVariables = uriVariables; } @@ -347,7 +347,7 @@ public abstract class UriComponents implements Serializable { private final Iterator valueIterator; - public VarArgsTemplateVariables(Object... uriVariableValues) { + public VarArgsTemplateVariables(@Nullable Object... uriVariableValues) { this.valueIterator = Arrays.asList(uriVariableValues).iterator(); } diff --git a/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java b/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java index 8aa36ccf196..c1d9930043a 100644 --- a/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java +++ b/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java @@ -337,17 +337,17 @@ public class UriComponentsBuilder implements UriBuilder, Cloneable { * @param uriVariableValues the URI variable values * @return the URI components with expanded values */ - public UriComponents buildAndExpand(Object... uriVariableValues) { + public UriComponents buildAndExpand(@Nullable Object... uriVariableValues) { return build().expand(uriVariableValues); } @Override - public URI build(Object... uriVariables) { + public URI build(@Nullable Object... uriVariables) { return buildInternal(EncodingHint.ENCODE_TEMPLATE).expand(uriVariables).toUri(); } @Override - public URI build(Map uriVariables) { + public URI build(Map uriVariables) { return buildInternal(EncodingHint.ENCODE_TEMPLATE).expand(uriVariables).toUri(); } diff --git a/spring-web/src/main/java/org/springframework/web/util/UriTemplateHandler.java b/spring-web/src/main/java/org/springframework/web/util/UriTemplateHandler.java index 0b7d06504b2..1cd17707e15 100644 --- a/spring-web/src/main/java/org/springframework/web/util/UriTemplateHandler.java +++ b/spring-web/src/main/java/org/springframework/web/util/UriTemplateHandler.java @@ -19,6 +19,8 @@ package org.springframework.web.util; import java.net.URI; import java.util.Map; +import org.jspecify.annotations.Nullable; + /** * Defines methods for expanding a URI template with variables. * @@ -34,7 +36,7 @@ public interface UriTemplateHandler { * @param uriVariables variable values * @return the created URI instance */ - URI expand(String uriTemplate, Map uriVariables); + URI expand(String uriTemplate, Map uriVariables); /** * Expand the given URI template with an array of URI variables. @@ -42,6 +44,6 @@ public interface UriTemplateHandler { * @param uriVariables variable values * @return the created URI instance */ - URI expand(String uriTemplate, Object... uriVariables); + URI expand(String uriTemplate, @Nullable Object... uriVariables); } diff --git a/spring-web/src/main/java/org/springframework/web/util/UriUtils.java b/spring-web/src/main/java/org/springframework/web/util/UriUtils.java index 9362697bf0a..de159baad4d 100644 --- a/spring-web/src/main/java/org/springframework/web/util/UriUtils.java +++ b/spring-web/src/main/java/org/springframework/web/util/UriUtils.java @@ -325,7 +325,7 @@ public abstract class UriUtils { * @return the encoded String * @since 5.0 */ - public static Map encodeUriVariables(Map uriVariables) { + public static Map encodeUriVariables(Map uriVariables) { Map result = CollectionUtils.newLinkedHashMap(uriVariables.size()); uriVariables.forEach((key, value) -> { String stringValue = (value != null ? value.toString() : ""); @@ -341,7 +341,7 @@ public abstract class UriUtils { * @return the encoded String * @since 5.0 */ - public static Object[] encodeUriVariables(Object... uriVariables) { + public static Object[] encodeUriVariables(@Nullable Object... uriVariables) { return Arrays.stream(uriVariables) .map(value -> { String stringValue = (value != null ? value.toString() : ""); diff --git a/spring-web/src/main/kotlin/org/springframework/web/client/RestOperationsExtensions.kt b/spring-web/src/main/kotlin/org/springframework/web/client/RestOperationsExtensions.kt index cefc9542eb4..61ebf19faa1 100644 --- a/spring-web/src/main/kotlin/org/springframework/web/client/RestOperationsExtensions.kt +++ b/spring-web/src/main/kotlin/org/springframework/web/client/RestOperationsExtensions.kt @@ -36,7 +36,7 @@ import kotlin.reflect.KClass * @since 5.0 */ @Throws(RestClientException::class) -inline fun RestOperations.getForObject(url: String, vararg uriVariables: Any): T = +inline fun RestOperations.getForObject(url: String, vararg uriVariables: Any?): T = getForObject(url, T::class.java as Class<*>, *uriVariables) as T /** @@ -92,7 +92,7 @@ inline fun RestOperations.getForEntity(url: URI): ResponseEntit * @since 5.0 */ @Throws(RestClientException::class) -inline fun RestOperations.getForEntity(url: String, vararg uriVariables: Any): ResponseEntity = +inline fun RestOperations.getForEntity(url: String, vararg uriVariables: Any?): ResponseEntity = getForEntity(url, T::class.java, *uriVariables) /** @@ -119,7 +119,7 @@ inline fun RestOperations.getForEntity(url: String, uriVariable */ @Throws(RestClientException::class) inline fun RestOperations.patchForObject(url: String, request: Any? = null, - vararg uriVariables: Any): T = + vararg uriVariables: Any?): T = patchForObject(url, request, T::class.java as Class<*>, *uriVariables) as T /** @@ -161,7 +161,7 @@ inline fun RestOperations.patchForObject(url: URI, request: Any? = n */ @Throws(RestClientException::class) inline fun RestOperations.postForObject(url: String, request: Any? = null, - vararg uriVariables: Any): T = + vararg uriVariables: Any?): T = postForObject(url, request, T::class.java as Class<*>, *uriVariables) as T /** @@ -205,7 +205,7 @@ inline fun RestOperations.postForObject(url: URI, request: Any? = nu */ @Throws(RestClientException::class) inline fun RestOperations.postForEntity(url: String, request: Any? = null, - vararg uriVariables: Any): ResponseEntity = + vararg uriVariables: Any?): ResponseEntity = postForEntity(url, request, T::class.java, *uriVariables) /** @@ -248,7 +248,7 @@ inline fun RestOperations.postForEntity(url: URI, request: Any? */ @Throws(RestClientException::class) inline fun RestOperations.exchange(url: String, method: HttpMethod, - requestEntity: HttpEntity<*>? = null, vararg uriVariables: Any): ResponseEntity = + requestEntity: HttpEntity<*>? = null, vararg uriVariables: Any?): ResponseEntity = exchange(url, method, requestEntity, object : ParameterizedTypeReference() {}, *uriVariables) /** diff --git a/spring-web/src/testFixtures/java/org/springframework/web/testfixture/http/server/reactive/MockServerHttpRequest.java b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/http/server/reactive/MockServerHttpRequest.java index 491ea6b6b7c..57328d53178 100644 --- a/spring-web/src/testFixtures/java/org/springframework/web/testfixture/http/server/reactive/MockServerHttpRequest.java +++ b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/http/server/reactive/MockServerHttpRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2025 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. @@ -120,7 +120,7 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest { * @param uriVars zero or more URI variables * @return the created builder */ - public static BaseBuilder get(String urlTemplate, Object... uriVars) { + public static BaseBuilder get(String urlTemplate, @Nullable Object... uriVars) { return method(HttpMethod.GET, urlTemplate, uriVars); } @@ -130,7 +130,7 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest { * @param uriVars zero or more URI variables * @return the created builder */ - public static BaseBuilder head(String urlTemplate, Object... uriVars) { + public static BaseBuilder head(String urlTemplate, @Nullable Object... uriVars) { return method(HttpMethod.HEAD, urlTemplate, uriVars); } @@ -140,7 +140,7 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest { * @param uriVars zero or more URI variables * @return the created builder */ - public static BodyBuilder post(String urlTemplate, Object... uriVars) { + public static BodyBuilder post(String urlTemplate, @Nullable Object... uriVars) { return method(HttpMethod.POST, urlTemplate, uriVars); } @@ -151,7 +151,7 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest { * @param uriVars zero or more URI variables * @return the created builder */ - public static BodyBuilder put(String urlTemplate, Object... uriVars) { + public static BodyBuilder put(String urlTemplate, @Nullable Object... uriVars) { return method(HttpMethod.PUT, urlTemplate, uriVars); } @@ -161,7 +161,7 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest { * @param uriVars zero or more URI variables * @return the created builder */ - public static BodyBuilder patch(String urlTemplate, Object... uriVars) { + public static BodyBuilder patch(String urlTemplate, @Nullable Object... uriVars) { return method(HttpMethod.PATCH, urlTemplate, uriVars); } @@ -171,7 +171,7 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest { * @param uriVars zero or more URI variables * @return the created builder */ - public static BaseBuilder delete(String urlTemplate, Object... uriVars) { + public static BaseBuilder delete(String urlTemplate, @Nullable Object... uriVars) { return method(HttpMethod.DELETE, urlTemplate, uriVars); } @@ -181,7 +181,7 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest { * @param uriVars zero or more URI variables * @return the created builder */ - public static BaseBuilder options(String urlTemplate, Object... uriVars) { + public static BaseBuilder options(String urlTemplate, @Nullable Object... uriVars) { return method(HttpMethod.OPTIONS, urlTemplate, uriVars); } @@ -206,7 +206,7 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest { * @param vars variables to expand into the template * @return the created builder */ - public static BodyBuilder method(HttpMethod method, String uri, Object... vars) { + public static BodyBuilder method(HttpMethod method, String uri, @Nullable Object... vars) { return method(method, toUri(uri, vars)); } @@ -221,12 +221,12 @@ public final class MockServerHttpRequest extends AbstractServerHttpRequest { * @deprecated in favor of {@link #method(HttpMethod, String, Object...)} */ @Deprecated - public static BodyBuilder method(String httpMethod, String uri, Object... vars) { + public static BodyBuilder method(String httpMethod, String uri, @Nullable Object... vars) { Assert.isTrue(StringUtils.hasText(httpMethod), "HTTP method is required."); return new DefaultBodyBuilder(HttpMethod.valueOf(httpMethod), toUri(uri, vars)); } - private static URI toUri(String uri, Object[] vars) { + private static URI toUri(String uri, @Nullable Object[] vars) { return UriComponentsBuilder.fromUriString(uri).buildAndExpand(vars).encode().toUri(); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java index 86174a9cc40..9b32b5bae69 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 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. @@ -216,7 +216,7 @@ final class DefaultWebClient implements WebClient { } @Override - public RequestBodySpec uri(String uriTemplate, Object... uriVariables) { + public RequestBodySpec uri(String uriTemplate, @Nullable Object... uriVariables) { UriBuilder uriBuilder = uriBuilderFactory.uriString(uriTemplate); attribute(URI_TEMPLATE_ATTRIBUTE, uriBuilder.toUriString()); return uri(uriBuilder.build(uriVariables)); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/WebClient.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/WebClient.java index 69e07aebf58..a7f6c528dfb 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/WebClient.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/WebClient.java @@ -28,6 +28,7 @@ import java.util.function.Predicate; import io.micrometer.observation.ObservationConvention; import io.micrometer.observation.ObservationRegistry; +import org.jspecify.annotations.Nullable; import org.reactivestreams.Publisher; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -391,7 +392,7 @@ public interface WebClient { * If a {@link UriBuilderFactory} was configured for the client (for example, * with a base URI) it will be used to expand the URI template. */ - S uri(String uri, Object... uriVariables); + S uri(String uri, @Nullable Object... uriVariables); /** * Specify the URI for the request using a URI template and URI variables. diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/client/AbstractWebSocketClient.java b/spring-websocket/src/main/java/org/springframework/web/socket/client/AbstractWebSocketClient.java index aee261e14c8..8ca609e5194 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/client/AbstractWebSocketClient.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/client/AbstractWebSocketClient.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 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. @@ -61,7 +61,7 @@ public abstract class AbstractWebSocketClient implements WebSocketClient { @Override public CompletableFuture execute(WebSocketHandler webSocketHandler, - String uriTemplate, Object... uriVars) { + String uriTemplate, @Nullable Object... uriVars) { Assert.notNull(uriTemplate, "'uriTemplate' must not be null"); URI uri = UriComponentsBuilder.fromUriString(uriTemplate).buildAndExpand(uriVars).encode().toUri(); diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/client/ConnectionManagerSupport.java b/spring-websocket/src/main/java/org/springframework/web/socket/client/ConnectionManagerSupport.java index ade1372af78..5bc8f0f98ae 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/client/ConnectionManagerSupport.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/client/ConnectionManagerSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2025 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. @@ -20,6 +20,7 @@ import java.net.URI; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.jspecify.annotations.Nullable; import org.springframework.context.SmartLifecycle; import org.springframework.web.util.UriComponentsBuilder; @@ -52,7 +53,7 @@ public abstract class ConnectionManagerSupport implements SmartLifecycle { /** * Constructor with a URI template and variables. */ - public ConnectionManagerSupport(String uriTemplate, Object... uriVariables) { + public ConnectionManagerSupport(String uriTemplate, @Nullable Object... uriVariables) { this.uri = UriComponentsBuilder.fromUriString(uriTemplate).buildAndExpand(uriVariables).encode().toUri(); } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/client/WebSocketClient.java b/spring-websocket/src/main/java/org/springframework/web/socket/client/WebSocketClient.java index 79df88e2313..3590fe78415 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/client/WebSocketClient.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/client/WebSocketClient.java @@ -46,7 +46,7 @@ public interface WebSocketClient { * @since 6.0 */ CompletableFuture execute(WebSocketHandler webSocketHandler, - String uriTemplate, Object... uriVariables); + String uriTemplate, @Nullable Object... uriVariables); /** * Execute a handshake request to the given url and handle the resulting diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/client/WebSocketConnectionManager.java b/spring-websocket/src/main/java/org/springframework/web/socket/client/WebSocketConnectionManager.java index 4dff63531cb..1de144bc684 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/client/WebSocketConnectionManager.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/client/WebSocketConnectionManager.java @@ -53,7 +53,7 @@ public class WebSocketConnectionManager extends ConnectionManagerSupport { * Constructor with the client to use and a handler to handle messages with. */ public WebSocketConnectionManager(WebSocketClient client, - WebSocketHandler webSocketHandler, String uriTemplate, Object... uriVariables) { + WebSocketHandler webSocketHandler, String uriTemplate, @Nullable Object... uriVariables) { super(uriTemplate, uriVariables); this.client = client; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/AnnotatedEndpointConnectionManager.java b/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/AnnotatedEndpointConnectionManager.java index 028cb60c4a5..2c515bfe55a 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/AnnotatedEndpointConnectionManager.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/AnnotatedEndpointConnectionManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2024 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. @@ -51,13 +51,13 @@ public class AnnotatedEndpointConnectionManager extends ConnectionManagerSupport private volatile @Nullable Session session; - public AnnotatedEndpointConnectionManager(Object endpoint, String uriTemplate, Object... uriVariables) { + public AnnotatedEndpointConnectionManager(Object endpoint, String uriTemplate, @Nullable Object... uriVariables) { super(uriTemplate, uriVariables); this.endpoint = endpoint; this.endpointProvider = null; } - public AnnotatedEndpointConnectionManager(Class endpointClass, String uriTemplate, Object... uriVariables) { + public AnnotatedEndpointConnectionManager(Class endpointClass, String uriTemplate, @Nullable Object... uriVariables) { super(uriTemplate, uriVariables); this.endpoint = null; this.endpointProvider = new BeanCreatingHandlerProvider<>(endpointClass); diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/EndpointConnectionManager.java b/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/EndpointConnectionManager.java index edebfdcb492..c5ca86fb0a9 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/EndpointConnectionManager.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/EndpointConnectionManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2025 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. @@ -62,14 +62,14 @@ public class EndpointConnectionManager extends ConnectionManagerSupport implemen private volatile @Nullable Session session; - public EndpointConnectionManager(Endpoint endpoint, String uriTemplate, Object... uriVariables) { + public EndpointConnectionManager(Endpoint endpoint, String uriTemplate, @Nullable Object... uriVariables) { super(uriTemplate, uriVariables); Assert.notNull(endpoint, "endpoint must not be null"); this.endpoint = endpoint; this.endpointProvider = null; } - public EndpointConnectionManager(Class endpointClass, String uriTemplate, Object... uriVars) { + public EndpointConnectionManager(Class endpointClass, String uriTemplate, @Nullable Object... uriVars) { super(uriTemplate, uriVars); Assert.notNull(endpointClass, "endpointClass must not be null"); this.endpoint = null; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/WebSocketStompClient.java b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/WebSocketStompClient.java index 28b020759dd..18efe57df51 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/WebSocketStompClient.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/WebSocketStompClient.java @@ -235,7 +235,7 @@ public class WebSocketStompClient extends StompClientSupport implements SmartLif * @return a CompletableFuture for access to the session when ready for use * @since 6.0 */ - public CompletableFuture connectAsync(String url, StompSessionHandler handler, Object... uriVars) { + public CompletableFuture connectAsync(String url, StompSessionHandler handler, @Nullable Object... uriVars) { return connectAsync(url, null, handler, uriVars); } @@ -251,7 +251,7 @@ public class WebSocketStompClient extends StompClientSupport implements SmartLif * @since 6.0 */ public CompletableFuture connectAsync(String url, @Nullable WebSocketHttpHeaders handshakeHeaders, - StompSessionHandler handler, Object... uriVariables) { + StompSessionHandler handler, @Nullable Object... uriVariables) { return connectAsync(url, handshakeHeaders, null, handler, uriVariables); } @@ -270,7 +270,7 @@ public class WebSocketStompClient extends StompClientSupport implements SmartLif * @since 6.0 */ public CompletableFuture connectAsync(String url, @Nullable WebSocketHttpHeaders handshakeHeaders, - @Nullable StompHeaders connectHeaders, StompSessionHandler handler, Object... uriVariables) { + @Nullable StompHeaders connectHeaders, StompSessionHandler handler, @Nullable Object... uriVariables) { Assert.notNull(url, "'url' must not be null"); URI uri = UriComponentsBuilder.fromUriString(url).buildAndExpand(uriVariables).encode().toUri(); diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/SockJsClient.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/SockJsClient.java index eab7d63758c..726832bc07f 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/SockJsClient.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/SockJsClient.java @@ -218,7 +218,7 @@ public class SockJsClient implements WebSocketClient, Lifecycle { @Override public CompletableFuture execute( - WebSocketHandler handler, String uriTemplate, Object... uriVars) { + WebSocketHandler handler, String uriTemplate, @Nullable Object... uriVars) { Assert.notNull(uriTemplate, "uriTemplate must not be null"); URI uri = UriComponentsBuilder.fromUriString(uriTemplate).buildAndExpand(uriVars).encode().toUri(); diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/client/WebSocketConnectionManagerTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/client/WebSocketConnectionManagerTests.java index d6fbc45ea45..382b22eae4e 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/client/WebSocketConnectionManagerTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/client/WebSocketConnectionManagerTests.java @@ -20,6 +20,7 @@ import java.net.URI; import java.util.List; import java.util.concurrent.CompletableFuture; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import org.springframework.context.Lifecycle; @@ -110,7 +111,7 @@ class WebSocketConnectionManagerTests { @Override public CompletableFuture execute(WebSocketHandler handler, - String uriTemplate, Object... uriVars) { + String uriTemplate, @Nullable Object... uriVars) { URI uri = UriComponentsBuilder.fromUriString(uriTemplate).buildAndExpand(uriVars).encode().toUri(); return execute(handler, null, uri);