Only copy UriBuilderFactory when customized

This commit ensures that, when creating a RestClient.Builder from a
RestTemplate, the UriBuilderFactory is only copied if it has been
changed from the default values.
Before this commit, the UriBuilderFactory was effectively alway copied,
resulting in not being able to use a baseUrl.

This commit also introduces a small memory optimization in
DefaultUriBuilderFactory, so that default environment variables are
created lazily.

Closes gh-32180
This commit is contained in:
Arjen Poutsma
2024-02-02 15:11:46 +01:00
parent 7025b7aac2
commit e15c150696
3 changed files with 85 additions and 18 deletions

View File

@@ -27,9 +27,11 @@ import org.springframework.http.client.JettyClientHttpRequestFactory;
import org.springframework.http.client.support.BasicAuthenticationInterceptor;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.lang.Nullable;
import org.springframework.web.util.DefaultUriBuilderFactory;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
/**
@@ -39,9 +41,9 @@ public class RestClientBuilderTests {
@SuppressWarnings("unchecked")
@Test
void createFromRestTemplate() throws NoSuchFieldException, IllegalAccessException {
void createFromRestTemplate() {
JettyClientHttpRequestFactory requestFactory = new JettyClientHttpRequestFactory();
DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory();
DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory("baseUri");
ResponseErrorHandler errorHandler = new DefaultResponseErrorHandler();
List<HttpMessageConverter<?>> restTemplateMessageConverters = List.of(new StringHttpMessageConverter());
ClientHttpRequestInterceptor interceptor = new BasicAuthenticationInterceptor("foo", "bar");
@@ -77,12 +79,28 @@ public class RestClientBuilderTests {
assertThat(initializers).containsExactly(initializer);
}
private static Object fieldValue(String name, DefaultRestClientBuilder instance)
throws NoSuchFieldException, IllegalAccessException {
@Test
void defaultUriBuilderFactory() {
RestTemplate restTemplate = new RestTemplate();
Field field = DefaultRestClientBuilder.class.getDeclaredField(name);
field.setAccessible(true);
RestClient.Builder builder = RestClient.builder(restTemplate);
assertThat(builder).isInstanceOf(DefaultRestClientBuilder.class);
DefaultRestClientBuilder defaultBuilder = (DefaultRestClientBuilder) builder;
return field.get(instance);
assertThat(fieldValue("uriBuilderFactory", defaultBuilder)).isNull();
}
@Nullable
private static Object fieldValue(String name, DefaultRestClientBuilder instance) {
try {
Field field = DefaultRestClientBuilder.class.getDeclaredField(name);
field.setAccessible(true);
return field.get(instance);
}
catch (NoSuchFieldException | IllegalAccessException ex) {
fail(ex.getMessage(), ex);
return null;
}
}
}