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:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user