Add null check when setting API version to preserve default value

See gh-36514

Signed-off-by: Vishnutheep B <vishnutheep@gmail.com>
This commit is contained in:
Vishnutheep B
2026-03-31 11:00:22 +01:00
committed by rstoyanchev
parent ebe3b45743
commit 00be6d3afd
4 changed files with 47 additions and 2 deletions
@@ -99,7 +99,9 @@ public final class RestClientAdapter implements HttpExchangeAdapter {
RestClient.RequestBodySpec spec = setUri(uriSpec, values);
spec.headers(headers -> headers.putAll(values.getHeaders()));
setCookieHeader(spec, values);
spec.apiVersion(values.getApiVersion());
if (values.getApiVersion() != null) {
spec.apiVersion(values.getApiVersion());
}
spec.attributes(attributes -> attributes.putAll(values.getAttributes()));
setBody(spec, values);
return spec;
@@ -200,6 +200,27 @@ class RestClientAdapterTests {
assertThat(actualResponse).isEqualTo("Hello Spring 2!");
}
@Test
void greetingWithDefaultApiVersion() throws Exception {
prepareResponse(builder ->
builder.setHeader("Content-Type", "text/plain").body("Hello Spring 2!"));
RestClient restClient = RestClient.builder()
.baseUrl(anotherServer.url("/").toString())
.defaultApiVersion("1.0")
.apiVersionInserter(ApiVersionInserter.useHeader("X-Version"))
.build();
RestClientAdapter adapter = RestClientAdapter.create(restClient);
Service service = HttpServiceProxyFactory.builderFor(adapter).build().createClient(Service.class);
String actualResponse = service.getGreeting();
RecordedRequest request = anotherServer.takeRequest();
assertThat(request.getHeaders().get("X-Version")).isEqualTo("1.0");
assertThat(actualResponse).isEqualTo("Hello Spring 2!");
}
@Test // see gh-36326
void getBodyWithGenericReturnType() {
prepareResponse(r -> r.setHeader("Content-Type", "application/json").body("{\"name\":\"Karl\"}"));
@@ -111,7 +111,9 @@ public final class WebClientAdapter extends AbstractReactorHttpExchangeAdapter {
WebClient.RequestBodySpec bodySpec = setUri(uriSpec, values);
bodySpec.headers(headers -> headers.putAll(values.getHeaders()));
bodySpec.cookies(cookies -> cookies.putAll(values.getCookies()));
bodySpec.apiVersion(values.getApiVersion());
if (values.getApiVersion() != null) {
bodySpec.apiVersion(values.getApiVersion());
}
bodySpec.attributes(attributes -> attributes.putAll(values.getAttributes()));
setBody(bodySpec, values);
return bodySpec;
@@ -48,6 +48,7 @@ import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.client.ApiVersionInserter;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.service.annotation.GetExchange;
@@ -129,6 +130,25 @@ class WebClientAdapterTests {
assertThat(attributes).containsEntry("myAttribute", "myAttributeValue");
}
@Test
void greetingWithDefaultApiVersion() throws InterruptedException {
prepareResponse(builder -> builder.setHeader("Content-Type", "text/plain").body("Hello Spring 2!"));
WebClient webClient = WebClient.builder()
.baseUrl(this.server.url("/").toString())
.defaultApiVersion("1.0")
.apiVersionInserter(ApiVersionInserter.useHeader("X-Version"))
.build();
StepVerifier.create(initService(webClient, Service.class).getGreeting())
.expectNext("Hello Spring 2!")
.expectComplete()
.verify(Duration.ofSeconds(5));
RecordedRequest request = this.server.takeRequest();
assertThat(request.getHeaders().get("X-Version")).isEqualTo("1.0");
}
@Test // see gh-36326
void getBodyWithGenericReturnType() {
prepareResponse(r -> r.setHeader("Content-Type", "application/json").body("{\"name\":\"Karl\"}"));