Skip to content

Commit d3755ab

Browse files
committed
Add RestClient.Builder#messageConverters(List)
This commit also introduces the validation of the RestClient message converters for both variants. Closes gh-33536
1 parent 0a00148 commit d3755ab

File tree

3 files changed

+62
-1
lines changed

3 files changed

+62
-1
lines changed

spring-web/src/main/java/org/springframework/web/client/DefaultRestClientBuilder.java

+15
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.net.URI;
2020
import java.util.ArrayList;
2121
import java.util.Arrays;
22+
import java.util.Collections;
2223
import java.util.LinkedHashMap;
2324
import java.util.List;
2425
import java.util.Map;
@@ -63,6 +64,7 @@
6364
*
6465
* @author Arjen Poutsma
6566
* @author Hyoungjune Kim
67+
* @author Sebastien Deleuze
6668
* @since 6.1
6769
*/
6870
final class DefaultRestClientBuilder implements RestClient.Builder {
@@ -358,6 +360,14 @@ public RestClient.Builder requestFactory(ClientHttpRequestFactory requestFactory
358360
@Override
359361
public RestClient.Builder messageConverters(Consumer<List<HttpMessageConverter<?>>> configurer) {
360362
configurer.accept(initMessageConverters());
363+
validateConverters(this.messageConverters);
364+
return this;
365+
}
366+
367+
@Override
368+
public RestClient.Builder messageConverters(List<HttpMessageConverter<?>> messageConverters) {
369+
validateConverters(messageConverters);
370+
this.messageConverters = Collections.unmodifiableList(messageConverters);
361371
return this;
362372
}
363373

@@ -413,6 +423,11 @@ else if (jsonbPresent) {
413423
return this.messageConverters;
414424
}
415425

426+
private void validateConverters(@Nullable List<HttpMessageConverter<?>> messageConverters) {
427+
Assert.notEmpty(messageConverters, "At least one HttpMessageConverter is required");
428+
Assert.noNullElements(messageConverters, "The HttpMessageConverter list must not contain null elements");
429+
}
430+
416431

417432
@Override
418433
public RestClient.Builder clone() {

spring-web/src/main/java/org/springframework/web/client/RestClient.java

+13-1
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
* </ul>
7474
*
7575
* @author Arjen Poutsma
76+
* @author Sebastien Deleuze
7677
* @since 6.1
7778
*/
7879
public interface RestClient {
@@ -399,11 +400,22 @@ Builder defaultStatusHandler(Predicate<HttpStatusCode> statusPredicate,
399400

400401
/**
401402
* Configure the message converters for the {@code RestClient} to use.
402-
* @param configurer the configurer to apply
403+
* @param configurer the configurer to apply on the list of default
404+
* {@link HttpMessageConverter} pre-initialized
403405
* @return this builder
406+
* @see #messageConverters(List)
404407
*/
405408
Builder messageConverters(Consumer<List<HttpMessageConverter<?>>> configurer);
406409

410+
/**
411+
* Set the message converters for the {@code RestClient} to use.
412+
* @param messageConverters the list of {@link HttpMessageConverter} to use
413+
* @return this builder
414+
* @since 6.2
415+
* @see #messageConverters(Consumer)
416+
*/
417+
Builder messageConverters(List<HttpMessageConverter<?>> messageConverters);
418+
407419
/**
408420
* Configure the {@link io.micrometer.observation.ObservationRegistry} to use
409421
* for recording HTTP client observations.

spring-web/src/test/java/org/springframework/web/client/RestClientBuilderTests.java

+34
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,11 @@
1818

1919
import java.lang.reflect.Field;
2020
import java.net.URI;
21+
import java.util.ArrayList;
22+
import java.util.Collections;
2123
import java.util.List;
2224

25+
import org.assertj.core.api.InstanceOfAssertFactories;
2326
import org.junit.jupiter.api.Test;
2427

2528
import org.springframework.http.client.ClientHttpRequestInitializer;
@@ -32,11 +35,13 @@
3235
import org.springframework.web.util.DefaultUriBuilderFactory;
3336

3437
import static org.assertj.core.api.Assertions.assertThat;
38+
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
3539
import static org.assertj.core.api.Assertions.fail;
3640

3741

3842
/**
3943
* @author Arjen Poutsma
44+
* @author Sebastien Deleuze
4045
*/
4146
public class RestClientBuilderTests {
4247

@@ -103,6 +108,35 @@ void defaultUri() {
103108
assertThat(fieldValue("baseUrl", defaultBuilder)).isEqualTo(baseUrl.toString());
104109
}
105110

111+
@Test
112+
void messageConvertersList() {
113+
StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
114+
RestClient.Builder builder = RestClient.builder();
115+
builder.messageConverters(List.of(stringConverter));
116+
117+
assertThat(builder).isInstanceOf(DefaultRestClientBuilder.class);
118+
DefaultRestClientBuilder defaultBuilder = (DefaultRestClientBuilder) builder;
119+
120+
assertThat(fieldValue("messageConverters", defaultBuilder))
121+
.asInstanceOf(InstanceOfAssertFactories.LIST)
122+
.containsExactly(stringConverter);
123+
}
124+
125+
@Test
126+
void messageConvertersListEmpty() {
127+
RestClient.Builder builder = RestClient.builder();
128+
List<HttpMessageConverter<?>> converters = Collections.emptyList();
129+
assertThatIllegalArgumentException().isThrownBy(() -> builder.messageConverters(converters));
130+
}
131+
132+
@Test
133+
void messageConvertersListWithNullElement() {
134+
RestClient.Builder builder = RestClient.builder();
135+
List<HttpMessageConverter<?>> converters = new ArrayList<>();
136+
converters.add(null);
137+
assertThatIllegalArgumentException().isThrownBy(() -> builder.messageConverters(converters));
138+
}
139+
106140
@Nullable
107141
private static Object fieldValue(String name, DefaultRestClientBuilder instance) {
108142
try {

0 commit comments

Comments
 (0)