Add RestClient.Builder#messageConverters(List)
This commit also introduces the validation of the RestClient message converters for both variants. Closes gh-33536
This commit is contained in:
@@ -19,6 +19,7 @@ package org.springframework.web.client;
|
||||
import java.net.URI;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -63,6 +64,7 @@ import org.springframework.web.util.UriTemplateHandler;
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @author Hyoungjune Kim
|
||||
* @author Sebastien Deleuze
|
||||
* @since 6.1
|
||||
*/
|
||||
final class DefaultRestClientBuilder implements RestClient.Builder {
|
||||
@@ -358,6 +360,14 @@ final class DefaultRestClientBuilder implements RestClient.Builder {
|
||||
@Override
|
||||
public RestClient.Builder messageConverters(Consumer<List<HttpMessageConverter<?>>> configurer) {
|
||||
configurer.accept(initMessageConverters());
|
||||
validateConverters(this.messageConverters);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RestClient.Builder messageConverters(List<HttpMessageConverter<?>> messageConverters) {
|
||||
validateConverters(messageConverters);
|
||||
this.messageConverters = Collections.unmodifiableList(messageConverters);
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -413,6 +423,11 @@ final class DefaultRestClientBuilder implements RestClient.Builder {
|
||||
return this.messageConverters;
|
||||
}
|
||||
|
||||
private void validateConverters(@Nullable List<HttpMessageConverter<?>> messageConverters) {
|
||||
Assert.notEmpty(messageConverters, "At least one HttpMessageConverter is required");
|
||||
Assert.noNullElements(messageConverters, "The HttpMessageConverter list must not contain null elements");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public RestClient.Builder clone() {
|
||||
|
||||
@@ -73,6 +73,7 @@ import org.springframework.web.util.UriBuilderFactory;
|
||||
* </ul>
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @author Sebastien Deleuze
|
||||
* @since 6.1
|
||||
*/
|
||||
public interface RestClient {
|
||||
@@ -399,11 +400,22 @@ public interface RestClient {
|
||||
|
||||
/**
|
||||
* Configure the message converters for the {@code RestClient} to use.
|
||||
* @param configurer the configurer to apply
|
||||
* @param configurer the configurer to apply on the list of default
|
||||
* {@link HttpMessageConverter} pre-initialized
|
||||
* @return this builder
|
||||
* @see #messageConverters(List)
|
||||
*/
|
||||
Builder messageConverters(Consumer<List<HttpMessageConverter<?>>> configurer);
|
||||
|
||||
/**
|
||||
* Set the message converters for the {@code RestClient} to use.
|
||||
* @param messageConverters the list of {@link HttpMessageConverter} to use
|
||||
* @return this builder
|
||||
* @since 6.2
|
||||
* @see #messageConverters(Consumer)
|
||||
*/
|
||||
Builder messageConverters(List<HttpMessageConverter<?>> messageConverters);
|
||||
|
||||
/**
|
||||
* Configure the {@link io.micrometer.observation.ObservationRegistry} to use
|
||||
* for recording HTTP client observations.
|
||||
|
||||
@@ -18,8 +18,11 @@ package org.springframework.web.client;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.net.URI;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.assertj.core.api.InstanceOfAssertFactories;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.http.client.ClientHttpRequestInitializer;
|
||||
@@ -32,11 +35,13 @@ 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.assertThatIllegalArgumentException;
|
||||
import static org.assertj.core.api.Assertions.fail;
|
||||
|
||||
|
||||
/**
|
||||
* @author Arjen Poutsma
|
||||
* @author Sebastien Deleuze
|
||||
*/
|
||||
public class RestClientBuilderTests {
|
||||
|
||||
@@ -103,6 +108,35 @@ public class RestClientBuilderTests {
|
||||
assertThat(fieldValue("baseUrl", defaultBuilder)).isEqualTo(baseUrl.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
void messageConvertersList() {
|
||||
StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
|
||||
RestClient.Builder builder = RestClient.builder();
|
||||
builder.messageConverters(List.of(stringConverter));
|
||||
|
||||
assertThat(builder).isInstanceOf(DefaultRestClientBuilder.class);
|
||||
DefaultRestClientBuilder defaultBuilder = (DefaultRestClientBuilder) builder;
|
||||
|
||||
assertThat(fieldValue("messageConverters", defaultBuilder))
|
||||
.asInstanceOf(InstanceOfAssertFactories.LIST)
|
||||
.containsExactly(stringConverter);
|
||||
}
|
||||
|
||||
@Test
|
||||
void messageConvertersListEmpty() {
|
||||
RestClient.Builder builder = RestClient.builder();
|
||||
List<HttpMessageConverter<?>> converters = Collections.emptyList();
|
||||
assertThatIllegalArgumentException().isThrownBy(() -> builder.messageConverters(converters));
|
||||
}
|
||||
|
||||
@Test
|
||||
void messageConvertersListWithNullElement() {
|
||||
RestClient.Builder builder = RestClient.builder();
|
||||
List<HttpMessageConverter<?>> converters = new ArrayList<>();
|
||||
converters.add(null);
|
||||
assertThatIllegalArgumentException().isThrownBy(() -> builder.messageConverters(converters));
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static Object fieldValue(String name, DefaultRestClientBuilder instance) {
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user