Skip to content

Commit 2ee7a8e

Browse files
committedFeb 18, 2025·
Add missing converters to DefaultRestClientBuilder
With this commit, DefaultRestClientBuilder configures the same default converters than RestTemplate. Closes gh-34439
1 parent 3c40e5e commit 2ee7a8e

File tree

2 files changed

+51
-9
lines changed

2 files changed

+51
-9
lines changed
 

Diff for: ‎spring-web/src/main/java/org/springframework/web/client/DefaultRestClientBuilder.java

+49-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2024 the original author or authors.
2+
* Copyright 2002-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -44,13 +44,19 @@
4444
import org.springframework.http.converter.HttpMessageConverter;
4545
import org.springframework.http.converter.ResourceHttpMessageConverter;
4646
import org.springframework.http.converter.StringHttpMessageConverter;
47+
import org.springframework.http.converter.cbor.KotlinSerializationCborHttpMessageConverter;
4748
import org.springframework.http.converter.cbor.MappingJackson2CborHttpMessageConverter;
49+
import org.springframework.http.converter.feed.AtomFeedHttpMessageConverter;
50+
import org.springframework.http.converter.feed.RssChannelHttpMessageConverter;
4851
import org.springframework.http.converter.json.GsonHttpMessageConverter;
4952
import org.springframework.http.converter.json.JsonbHttpMessageConverter;
5053
import org.springframework.http.converter.json.KotlinSerializationJsonHttpMessageConverter;
5154
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
55+
import org.springframework.http.converter.protobuf.KotlinSerializationProtobufHttpMessageConverter;
5256
import org.springframework.http.converter.smile.MappingJackson2SmileHttpMessageConverter;
5357
import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter;
58+
import org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter;
59+
import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter;
5460
import org.springframework.http.converter.yaml.MappingJackson2YamlHttpMessageConverter;
5561
import org.springframework.lang.Nullable;
5662
import org.springframework.util.Assert;
@@ -84,20 +90,30 @@ final class DefaultRestClientBuilder implements RestClient.Builder {
8490

8591
// message factories
8692

87-
private static final boolean jackson2Present;
93+
private static final boolean romePresent;
8894

89-
private static final boolean gsonPresent;
95+
private static final boolean jaxb2Present;
9096

91-
private static final boolean jsonbPresent;
97+
private static final boolean jackson2Present;
9298

93-
private static final boolean kotlinSerializationJsonPresent;
99+
private static final boolean jackson2XmlPresent;
94100

95101
private static final boolean jackson2SmilePresent;
96102

97103
private static final boolean jackson2CborPresent;
98104

99105
private static final boolean jackson2YamlPresent;
100106

107+
private static final boolean gsonPresent;
108+
109+
private static final boolean jsonbPresent;
110+
111+
private static final boolean kotlinSerializationCborPresent;
112+
113+
private static final boolean kotlinSerializationJsonPresent;
114+
115+
private static final boolean kotlinSerializationProtobufPresent;
116+
101117

102118
static {
103119
ClassLoader loader = DefaultRestClientBuilder.class.getClassLoader();
@@ -107,14 +123,19 @@ final class DefaultRestClientBuilder implements RestClient.Builder {
107123
reactorNettyClientPresent = ClassUtils.isPresent("reactor.netty.http.client.HttpClient", loader);
108124
jdkClientPresent = ClassUtils.isPresent("java.net.http.HttpClient", loader);
109125

126+
romePresent = ClassUtils.isPresent("com.rometools.rome.feed.WireFeed", loader);
127+
jaxb2Present = ClassUtils.isPresent("jakarta.xml.bind.Binder", loader);
110128
jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", loader) &&
111129
ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", loader);
112-
gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", loader);
113-
jsonbPresent = ClassUtils.isPresent("jakarta.json.bind.Jsonb", loader);
114-
kotlinSerializationJsonPresent = ClassUtils.isPresent("kotlinx.serialization.json.Json", loader);
130+
jackson2XmlPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", loader);
115131
jackson2SmilePresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory", loader);
116132
jackson2CborPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.cbor.CBORFactory", loader);
117133
jackson2YamlPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.yaml.YAMLFactory", loader);
134+
gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", loader);
135+
jsonbPresent = ClassUtils.isPresent("jakarta.json.bind.Jsonb", loader);
136+
kotlinSerializationCborPresent = ClassUtils.isPresent("kotlinx.serialization.cbor.Cbor", loader);
137+
kotlinSerializationJsonPresent = ClassUtils.isPresent("kotlinx.serialization.json.Json", loader);
138+
kotlinSerializationProtobufPresent = ClassUtils.isPresent("kotlinx.serialization.protobuf.ProtoBuf", loader);
118139
}
119140

120141
@Nullable
@@ -428,6 +449,22 @@ private List<HttpMessageConverter<?>> initMessageConverters() {
428449
this.messageConverters.add(new ResourceHttpMessageConverter(false));
429450
this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
430451

452+
if (romePresent) {
453+
this.messageConverters.add(new AtomFeedHttpMessageConverter());
454+
this.messageConverters.add(new RssChannelHttpMessageConverter());
455+
}
456+
457+
if (jackson2XmlPresent) {
458+
this.messageConverters.add(new MappingJackson2XmlHttpMessageConverter());
459+
}
460+
else if (jaxb2Present) {
461+
this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
462+
}
463+
464+
if (kotlinSerializationProtobufPresent) {
465+
this.messageConverters.add(new KotlinSerializationProtobufHttpMessageConverter());
466+
}
467+
431468
if (kotlinSerializationJsonPresent) {
432469
this.messageConverters.add(new KotlinSerializationJsonHttpMessageConverter());
433470
}
@@ -446,9 +483,13 @@ else if (jsonbPresent) {
446483
if (jackson2CborPresent) {
447484
this.messageConverters.add(new MappingJackson2CborHttpMessageConverter());
448485
}
486+
else if (kotlinSerializationCborPresent) {
487+
this.messageConverters.add(new KotlinSerializationCborHttpMessageConverter());
488+
}
449489
if (jackson2YamlPresent) {
450490
this.messageConverters.add(new MappingJackson2YamlHttpMessageConverter());
451491
}
492+
452493
}
453494
return this.messageConverters;
454495
}

Diff for: ‎spring-web/src/main/java/org/springframework/web/client/RestTemplate.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat
148148

149149
static {
150150
ClassLoader classLoader = RestTemplate.class.getClassLoader();
151+
151152
romePresent = ClassUtils.isPresent("com.rometools.rome.feed.WireFeed", classLoader);
152153
jaxb2Present = ClassUtils.isPresent("jakarta.xml.bind.Binder", classLoader);
153154
jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader) &&
@@ -186,7 +187,6 @@ public RestTemplate() {
186187
this.messageConverters.add(new ByteArrayHttpMessageConverter());
187188
this.messageConverters.add(new StringHttpMessageConverter());
188189
this.messageConverters.add(new ResourceHttpMessageConverter(false));
189-
190190
this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
191191

192192
if (romePresent) {
@@ -208,6 +208,7 @@ else if (jaxb2Present) {
208208
if (kotlinSerializationJsonPresent) {
209209
this.messageConverters.add(new KotlinSerializationJsonHttpMessageConverter());
210210
}
211+
211212
if (jackson2Present) {
212213
this.messageConverters.add(new MappingJackson2HttpMessageConverter());
213214
}

0 commit comments

Comments
 (0)