Skip to content

Commit ec48c47

Browse files
committed
Make URI template variables nullable
Closes gh-34221
1 parent bce7d87 commit ec48c47

File tree

33 files changed

+172
-165
lines changed

33 files changed

+172
-165
lines changed

spring-test/src/main/java/org/springframework/mock/http/server/reactive/MockServerHttpRequest.java

+11-11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2023 the original author or authors.
2+
* Copyright 2002-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -119,7 +119,7 @@ public <T> T getNativeRequest() {
119119
* @param uriVars zero or more URI variables
120120
* @return the created builder
121121
*/
122-
public static BaseBuilder<?> get(String urlTemplate, Object... uriVars) {
122+
public static BaseBuilder<?> get(String urlTemplate, @Nullable Object... uriVars) {
123123
return method(HttpMethod.GET, urlTemplate, uriVars);
124124
}
125125

@@ -129,7 +129,7 @@ public static BaseBuilder<?> get(String urlTemplate, Object... uriVars) {
129129
* @param uriVars zero or more URI variables
130130
* @return the created builder
131131
*/
132-
public static BaseBuilder<?> head(String urlTemplate, Object... uriVars) {
132+
public static BaseBuilder<?> head(String urlTemplate, @Nullable Object... uriVars) {
133133
return method(HttpMethod.HEAD, urlTemplate, uriVars);
134134
}
135135

@@ -139,7 +139,7 @@ public static BaseBuilder<?> head(String urlTemplate, Object... uriVars) {
139139
* @param uriVars zero or more URI variables
140140
* @return the created builder
141141
*/
142-
public static BodyBuilder post(String urlTemplate, Object... uriVars) {
142+
public static BodyBuilder post(String urlTemplate, @Nullable Object... uriVars) {
143143
return method(HttpMethod.POST, urlTemplate, uriVars);
144144
}
145145

@@ -150,7 +150,7 @@ public static BodyBuilder post(String urlTemplate, Object... uriVars) {
150150
* @param uriVars zero or more URI variables
151151
* @return the created builder
152152
*/
153-
public static BodyBuilder put(String urlTemplate, Object... uriVars) {
153+
public static BodyBuilder put(String urlTemplate, @Nullable Object... uriVars) {
154154
return method(HttpMethod.PUT, urlTemplate, uriVars);
155155
}
156156

@@ -160,7 +160,7 @@ public static BodyBuilder put(String urlTemplate, Object... uriVars) {
160160
* @param uriVars zero or more URI variables
161161
* @return the created builder
162162
*/
163-
public static BodyBuilder patch(String urlTemplate, Object... uriVars) {
163+
public static BodyBuilder patch(String urlTemplate, @Nullable Object... uriVars) {
164164
return method(HttpMethod.PATCH, urlTemplate, uriVars);
165165
}
166166

@@ -170,7 +170,7 @@ public static BodyBuilder patch(String urlTemplate, Object... uriVars) {
170170
* @param uriVars zero or more URI variables
171171
* @return the created builder
172172
*/
173-
public static BaseBuilder<?> delete(String urlTemplate, Object... uriVars) {
173+
public static BaseBuilder<?> delete(String urlTemplate, @Nullable Object... uriVars) {
174174
return method(HttpMethod.DELETE, urlTemplate, uriVars);
175175
}
176176

@@ -180,7 +180,7 @@ public static BaseBuilder<?> delete(String urlTemplate, Object... uriVars) {
180180
* @param uriVars zero or more URI variables
181181
* @return the created builder
182182
*/
183-
public static BaseBuilder<?> options(String urlTemplate, Object... uriVars) {
183+
public static BaseBuilder<?> options(String urlTemplate, @Nullable Object... uriVars) {
184184
return method(HttpMethod.OPTIONS, urlTemplate, uriVars);
185185
}
186186

@@ -205,7 +205,7 @@ public static BodyBuilder method(HttpMethod method, URI url) {
205205
* @param vars variables to expand into the template
206206
* @return the created builder
207207
*/
208-
public static BodyBuilder method(HttpMethod method, String uri, Object... vars) {
208+
public static BodyBuilder method(HttpMethod method, String uri, @Nullable Object... vars) {
209209
return method(method, toUri(uri, vars));
210210
}
211211

@@ -220,12 +220,12 @@ public static BodyBuilder method(HttpMethod method, String uri, Object... vars)
220220
* @deprecated as of Spring Framework 6.0 in favor of {@link #method(HttpMethod, String, Object...)}
221221
*/
222222
@Deprecated(since = "6.0")
223-
public static BodyBuilder method(String httpMethod, String uri, Object... vars) {
223+
public static BodyBuilder method(String httpMethod, String uri, @Nullable Object... vars) {
224224
Assert.hasText(httpMethod, "HTTP method is required.");
225225
return new DefaultBodyBuilder(HttpMethod.valueOf(httpMethod), toUri(uri, vars));
226226
}
227227

228-
private static URI toUri(String uri, Object[] vars) {
228+
private static URI toUri(String uri, @Nullable Object[] vars) {
229229
return UriComponentsBuilder.fromUriString(uri).buildAndExpand(vars).encode().toUri();
230230
}
231231

spring-test/src/main/java/org/springframework/test/web/UriAssert.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public UriAssert(@Nullable String actual, String displayName) {
5656
* @param uriVars the values to replace the URI template variables
5757
* @see UriComponentsBuilder#buildAndExpand(Object...)
5858
*/
59-
public UriAssert isEqualToTemplate(String uriTemplate, Object... uriVars) {
59+
public UriAssert isEqualToTemplate(String uriTemplate, @Nullable Object... uriVars) {
6060
String uri = buildUri(uriTemplate, uriVars);
6161
return isEqualTo(uri);
6262
}
@@ -81,7 +81,7 @@ public UriAssert matchesAntPattern(String uriPattern) {
8181
}
8282

8383

84-
private String buildUri(String uriTemplate, Object... uriVars) {
84+
private String buildUri(String uriTemplate, @Nullable Object... uriVars) {
8585
try {
8686
return UriComponentsBuilder.fromUriString(uriTemplate)
8787
.buildAndExpand(uriVars).encode().toUriString();

spring-test/src/main/java/org/springframework/test/web/client/match/MockRestRequestMatchers.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2023 the original author or authors.
2+
* Copyright 2002-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
2323
import javax.xml.xpath.XPathExpressionException;
2424

2525
import org.hamcrest.Matcher;
26+
import org.jspecify.annotations.Nullable;
2627

2728
import org.springframework.http.HttpHeaders;
2829
import org.springframework.http.HttpMethod;
@@ -98,7 +99,7 @@ public static RequestMatcher requestTo(String expectedUri) {
9899
* @param uriVars zero or more URI variables to populate the expected URI
99100
* @return the request matcher
100101
*/
101-
public static RequestMatcher requestToUriTemplate(String expectedUri, Object... uriVars) {
102+
public static RequestMatcher requestToUriTemplate(String expectedUri, @Nullable Object... uriVars) {
102103
Assert.notNull(expectedUri, "'uri' must not be null");
103104
URI uri = UriComponentsBuilder.fromUriString(expectedUri).buildAndExpand(uriVars).encode().toUri();
104105
return requestTo(uri);

spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2024 the original author or authors.
2+
* Copyright 2002-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -202,13 +202,13 @@ private class DefaultRequestBodyUriSpec implements RequestBodyUriSpec {
202202
}
203203

204204
@Override
205-
public RequestBodySpec uri(String uriTemplate, Object... uriVariables) {
205+
public RequestBodySpec uri(String uriTemplate, @Nullable Object... uriVariables) {
206206
this.uriTemplate = uriTemplate;
207207
return uri(DefaultWebTestClient.this.uriBuilderFactory.expand(uriTemplate, uriVariables));
208208
}
209209

210210
@Override
211-
public RequestBodySpec uri(String uriTemplate, Map<String, ?> uriVariables) {
211+
public RequestBodySpec uri(String uriTemplate, Map<String, ? extends @Nullable Object> uriVariables) {
212212
this.uriTemplate = uriTemplate;
213213
return uri(DefaultWebTestClient.this.uriBuilderFactory.expand(uriTemplate, uriVariables));
214214
}

spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -557,15 +557,15 @@ interface UriSpec<S extends RequestHeadersSpec<?>> {
557557
* with a base URI) it will be used to expand the URI template.
558558
* @return spec to add headers or perform the exchange
559559
*/
560-
S uri(String uri, Object... uriVariables);
560+
S uri(String uri, @Nullable Object... uriVariables);
561561

562562
/**
563563
* Specify the URI for the request using a URI template and URI variables.
564564
* <p>If a {@link UriBuilderFactory} was configured for the client (for example,
565565
* with a base URI) it will be used to expand the URI template.
566566
* @return spec to add headers or perform the exchange
567567
*/
568-
S uri(String uri, Map<String, ?> uriVariables);
568+
S uri(String uri, Map<String, ? extends @Nullable Object> uriVariables);
569569

570570
/**
571571
* Build the URI for the request with a {@link UriBuilder} obtained

spring-test/src/main/java/org/springframework/test/web/servlet/request/AbstractMockHttpServletRequestBuilder.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2024 the original author or authors.
2+
* Copyright 2002-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -151,7 +151,7 @@ public B uri(URI uri) {
151151
/**
152152
* Specify the URI for the request using a URI template and URI variables.
153153
*/
154-
public B uri(String uriTemplate, Object... uriVariables) {
154+
public B uri(String uriTemplate, @Nullable Object... uriVariables) {
155155
return updateUri(initUri(uriTemplate, uriVariables), uriTemplate);
156156
}
157157

@@ -161,7 +161,7 @@ private B updateUri(URI uri, @Nullable String uriTemplate) {
161161
return self();
162162
}
163163

164-
private static URI initUri(String uri, Object[] vars) {
164+
private static URI initUri(String uri, @Nullable Object[] vars) {
165165
Assert.notNull(uri, "'uri' must not be null");
166166
Assert.isTrue(uri.isEmpty() || uri.startsWith("/") || uri.startsWith("http://") || uri.startsWith("https://"),
167167
() -> "'uri' should start with a path or be a complete HTTP URI: " + uri);

spring-test/src/main/java/org/springframework/test/web/servlet/request/MockHttpServletRequestBuilder.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2024 the original author or authors.
2+
* Copyright 2002-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -75,7 +75,7 @@ public MockHttpServletRequestBuilder uri(URI uri) {
7575
}
7676

7777
@Override
78-
public MockHttpServletRequestBuilder uri(String uriTemplate, Object... uriVariables) {
78+
public MockHttpServletRequestBuilder uri(String uriTemplate, @Nullable Object... uriVariables) {
7979
return super.uri(uriTemplate, uriVariables);
8080
}
8181

spring-test/src/main/java/org/springframework/test/web/servlet/request/MockMvcRequestBuilders.java

+12-11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2024 the original author or authors.
2+
* Copyright 2002-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
1919
import java.net.URI;
2020

2121
import jakarta.servlet.DispatcherType;
22+
import org.jspecify.annotations.Nullable;
2223

2324
import org.springframework.http.HttpMethod;
2425
import org.springframework.mock.web.MockHttpServletRequest;
@@ -52,7 +53,7 @@ public abstract class MockMvcRequestBuilders {
5253
* @param uriTemplate a URI template; the resulting URI will be encoded
5354
* @param uriVariables zero or more URI variables
5455
*/
55-
public static MockHttpServletRequestBuilder get(String uriTemplate, Object... uriVariables) {
56+
public static MockHttpServletRequestBuilder get(String uriTemplate, @Nullable Object... uriVariables) {
5657
return new MockHttpServletRequestBuilder(HttpMethod.GET).uri(uriTemplate, uriVariables);
5758
}
5859

@@ -70,7 +71,7 @@ public static MockHttpServletRequestBuilder get(URI uri) {
7071
* @param uriTemplate a URI template; the resulting URI will be encoded
7172
* @param uriVariables zero or more URI variables
7273
*/
73-
public static MockHttpServletRequestBuilder post(String uriTemplate, Object... uriVariables) {
74+
public static MockHttpServletRequestBuilder post(String uriTemplate, @Nullable Object... uriVariables) {
7475
return new MockHttpServletRequestBuilder(HttpMethod.POST).uri(uriTemplate, uriVariables);
7576
}
7677

@@ -88,7 +89,7 @@ public static MockHttpServletRequestBuilder post(URI uri) {
8889
* @param uriTemplate a URI template; the resulting URI will be encoded
8990
* @param uriVariables zero or more URI variables
9091
*/
91-
public static MockHttpServletRequestBuilder put(String uriTemplate, Object... uriVariables) {
92+
public static MockHttpServletRequestBuilder put(String uriTemplate, @Nullable Object... uriVariables) {
9293
return new MockHttpServletRequestBuilder(HttpMethod.PUT).uri(uriTemplate, uriVariables);
9394
}
9495

@@ -106,7 +107,7 @@ public static MockHttpServletRequestBuilder put(URI uri) {
106107
* @param uriTemplate a URI template; the resulting URI will be encoded
107108
* @param uriVariables zero or more URI variables
108109
*/
109-
public static MockHttpServletRequestBuilder patch(String uriTemplate, Object... uriVariables) {
110+
public static MockHttpServletRequestBuilder patch(String uriTemplate,@Nullable Object... uriVariables) {
110111
return new MockHttpServletRequestBuilder(HttpMethod.PATCH).uri(uriTemplate, uriVariables);
111112
}
112113

@@ -124,7 +125,7 @@ public static MockHttpServletRequestBuilder patch(URI uri) {
124125
* @param uriTemplate a URI template; the resulting URI will be encoded
125126
* @param uriVariables zero or more URI variables
126127
*/
127-
public static MockHttpServletRequestBuilder delete(String uriTemplate, Object... uriVariables) {
128+
public static MockHttpServletRequestBuilder delete(String uriTemplate, @Nullable Object... uriVariables) {
128129
return new MockHttpServletRequestBuilder(HttpMethod.DELETE).uri(uriTemplate, uriVariables);
129130
}
130131

@@ -142,7 +143,7 @@ public static MockHttpServletRequestBuilder delete(URI uri) {
142143
* @param uriTemplate a URI template; the resulting URI will be encoded
143144
* @param uriVariables zero or more URI variables
144145
*/
145-
public static MockHttpServletRequestBuilder options(String uriTemplate, Object... uriVariables) {
146+
public static MockHttpServletRequestBuilder options(String uriTemplate, @Nullable Object... uriVariables) {
146147
return new MockHttpServletRequestBuilder(HttpMethod.OPTIONS).uri(uriTemplate, uriVariables);
147148
}
148149

@@ -161,7 +162,7 @@ public static MockHttpServletRequestBuilder options(URI uri) {
161162
* @param uriVariables zero or more URI variables
162163
* @since 4.1
163164
*/
164-
public static MockHttpServletRequestBuilder head(String uriTemplate, Object... uriVariables) {
165+
public static MockHttpServletRequestBuilder head(String uriTemplate, @Nullable Object... uriVariables) {
165166
return new MockHttpServletRequestBuilder(HttpMethod.HEAD).uri(uriTemplate, uriVariables);
166167
}
167168

@@ -180,7 +181,7 @@ public static MockHttpServletRequestBuilder head(URI uri) {
180181
* @param uriTemplate a URI template; the resulting URI will be encoded
181182
* @param uriVariables zero or more URI variables
182183
*/
183-
public static MockHttpServletRequestBuilder request(HttpMethod method, String uriTemplate, Object... uriVariables) {
184+
public static MockHttpServletRequestBuilder request(HttpMethod method, String uriTemplate, @Nullable Object... uriVariables) {
184185
return new MockHttpServletRequestBuilder(method).uri(uriTemplate, uriVariables);
185186
}
186187

@@ -213,7 +214,7 @@ public static MockHttpServletRequestBuilder request(String httpMethod, URI uri)
213214
* @param uriVariables zero or more URI variables
214215
* @since 5.0
215216
*/
216-
public static MockMultipartHttpServletRequestBuilder multipart(String uriTemplate, Object... uriVariables) {
217+
public static MockMultipartHttpServletRequestBuilder multipart(String uriTemplate, @Nullable Object... uriVariables) {
217218
MockMultipartHttpServletRequestBuilder builder = new MockMultipartHttpServletRequestBuilder();
218219
builder.uri(uriTemplate, uriVariables);
219220
return builder;
@@ -227,7 +228,7 @@ public static MockMultipartHttpServletRequestBuilder multipart(String uriTemplat
227228
* @param uriVariables zero or more URI variables
228229
* @since 5.3.22
229230
*/
230-
public static MockMultipartHttpServletRequestBuilder multipart(HttpMethod httpMethod, String uriTemplate, Object... uriVariables) {
231+
public static MockMultipartHttpServletRequestBuilder multipart(HttpMethod httpMethod, String uriTemplate, @Nullable Object... uriVariables) {
231232
MockMultipartHttpServletRequestBuilder builder = new MockMultipartHttpServletRequestBuilder(httpMethod);
232233
builder.uri(uriTemplate, uriVariables);
233234
return builder;

spring-test/src/main/java/org/springframework/test/web/servlet/result/MockMvcResultMatchers.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2020 the original author or authors.
2+
* Copyright 2002-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -98,7 +98,7 @@ public static ResultMatcher forwardedUrl(@Nullable String expectedUrl) {
9898
* @param uriVars zero or more URI variables to populate the template
9999
* @see UriComponentsBuilder#fromUriString(String)
100100
*/
101-
public static ResultMatcher forwardedUrlTemplate(String urlTemplate, Object... uriVars) {
101+
public static ResultMatcher forwardedUrlTemplate(String urlTemplate, @Nullable Object... uriVars) {
102102
String uri = UriComponentsBuilder.fromUriString(urlTemplate).buildAndExpand(uriVars).encode().toUriString();
103103
return forwardedUrl(uri);
104104
}
@@ -137,7 +137,7 @@ public static ResultMatcher redirectedUrl(String expectedUrl) {
137137
* @param uriVars zero or more URI variables to populate the template
138138
* @see UriComponentsBuilder#fromUriString(String)
139139
*/
140-
public static ResultMatcher redirectedUrlTemplate(String urlTemplate, Object... uriVars) {
140+
public static ResultMatcher redirectedUrlTemplate(String urlTemplate, @Nullable Object... uriVars) {
141141
String uri = UriComponentsBuilder.fromUriString(urlTemplate).buildAndExpand(uriVars).encode().toUriString();
142142
return redirectedUrl(uri);
143143
}

0 commit comments

Comments
 (0)