Improve converter config in RestClient.Builder

Internally maintain a chain of HttpMessageConverters.ClientBuilder
consumers in addition to the List of converters.

List based methods apply to the list.
HttpMessageConverters based methods are composed into a Consumer.

At build() time prepare a single HttpMessageConverters.ClientBuilder.
Insert list based converters first.
Apply HttpMessageConverters consumers after that.

Deprecate both List methods. Eventually, HttpMessageConverters should
be the main mechanism. In the mean time we layer them as described.

Closes gh-35578
This commit is contained in:
rstoyanchev
2025-10-07 14:36:39 +01:00
parent d057eb2e5d
commit e11cb2d856
3 changed files with 76 additions and 47 deletions
@@ -112,6 +112,7 @@ public class RestClientBuilderTests {
assertThat(fieldValue("baseUrl", defaultBuilder)).isEqualTo(baseUrl.toString());
}
@SuppressWarnings("removal")
@Test
void messageConvertersList() {
StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
@@ -126,6 +127,7 @@ public class RestClientBuilderTests {
.containsExactly(stringConverter);
}
@SuppressWarnings("removal")
@Test
void messageConvertersListEmpty() {
RestClient.Builder builder = RestClient.builder();
@@ -133,6 +135,7 @@ public class RestClientBuilderTests {
assertThatIllegalArgumentException().isThrownBy(() -> builder.messageConverters(converters));
}
@SuppressWarnings("removal")
@Test
void messageConvertersListWithNullElement() {
RestClient.Builder builder = RestClient.builder();
@@ -147,9 +150,9 @@ public class RestClientBuilderTests {
RestClient.Builder builder = RestClient.builder();
builder.configureMessageConverters(clientBuilder -> clientBuilder.stringMessageConverter(stringConverter));
assertThat(builder).isInstanceOf(DefaultRestClientBuilder.class);
DefaultRestClientBuilder defaultBuilder = (DefaultRestClientBuilder) builder;
DefaultRestClient restClient = (DefaultRestClient) builder.build();
assertThat(fieldValue("messageConverters", defaultBuilder))
assertThat(fieldValue("messageConverters", restClient))
.asInstanceOf(InstanceOfAssertFactories.LIST)
.hasExactlyElementsOfTypes(StringHttpMessageConverter.class, AllEncompassingFormHttpMessageConverter.class);
}