Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 3a61461

Browse files
Adapt to changes in HttpMessageConverter customization API in latest Framework.
Also rework registration of HttpMessageConverters to not replace the default ones. See GH-3292.
1 parent 84bfc04 commit 3a61461

File tree

6 files changed

+52
-50
lines changed

6 files changed

+52
-50
lines changed

‎pom.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,16 @@
400400
<id>spring-milestone</id>
401401
<url>https://repo.spring.io/milestone</url>
402402
</repository>
403+
<repository>
404+
<id>central-snapshot</id>
405+
<url>https://central.sonatype.com/repository/maven-snapshots/</url>
406+
<snapshots>
407+
<enabled>true</enabled>
408+
</snapshots>
409+
<releases>
410+
<enabled>false</enabled>
411+
</releases>
412+
</repository>
403413
</repositories>
404414

405415
</project>

‎src/main/java/org/springframework/data/web/ProjectingJacksonHttpMessageConverter.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import tools.jackson.core.JsonGenerator;
1919
import tools.jackson.databind.ObjectMapper;
2020
import tools.jackson.databind.ObjectReader;
21+
import tools.jackson.databind.json.JsonMapper;
2122

2223
import java.io.IOException;
2324
import java.io.InputStream;
@@ -40,7 +41,6 @@
4041
import org.springframework.data.projection.SpelAwareProxyProjectionFactory;
4142
import org.springframework.http.HttpInputMessage;
4243
import org.springframework.http.MediaType;
43-
import org.springframework.http.converter.HttpMessageConverter;
4444
import org.springframework.http.converter.HttpMessageNotReadableException;
4545
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter;
4646
import org.springframework.util.Assert;
@@ -53,8 +53,8 @@
5353
import com.jayway.jsonpath.spi.mapper.MappingProvider;
5454

5555
/**
56-
* {@link HttpMessageConverter} implementation to enable projected JSON binding to interfaces annotated with
57-
* {@link ProjectedPayload}.
56+
* {@link org.springframework.http.converter.HttpMessageConverter} implementation to enable projected JSON binding to
57+
* interfaces annotated with {@link ProjectedPayload}.
5858
*
5959
* @author Mark Paluch
6060
* @author Oliver Gierke
@@ -72,15 +72,15 @@ public class ProjectingJacksonHttpMessageConverter extends JacksonJsonHttpMessag
7272
* Creates a new {@link ProjectingJacksonHttpMessageConverter} using a default {@link ObjectMapper}.
7373
*/
7474
public ProjectingJacksonHttpMessageConverter() {
75-
this.projectionFactory = initProjectionFactory(getObjectMapper());
75+
this.projectionFactory = initProjectionFactory(getMapper());
7676
}
7777

7878
/**
7979
* Creates a new {@link ProjectingJacksonHttpMessageConverter} for the given {@link ObjectMapper}.
8080
*
8181
* @param mapper must not be {@literal null}.
8282
*/
83-
public ProjectingJacksonHttpMessageConverter(ObjectMapper mapper) {
83+
public ProjectingJacksonHttpMessageConverter(JsonMapper mapper) {
8484

8585
super(mapper);
8686

‎src/main/java/org/springframework/data/web/config/SpringDataJackson3Configuration.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import org.springframework.context.annotation.Bean;
3434
import org.springframework.data.domain.Page;
3535
import org.springframework.data.domain.PageImpl;
36-
import org.springframework.data.geo.GeoModule;
36+
import org.springframework.data.geo.GeoJacksonModule;
3737
import org.springframework.data.web.PagedModel;
3838
import org.springframework.data.web.config.EnableSpringDataWebSupport.PageSerializationMode;
3939
import org.springframework.util.ClassUtils;
@@ -47,12 +47,13 @@
4747
*/
4848
public class SpringDataJackson3Configuration implements SpringDataJackson3Modules {
4949

50-
@Nullable
51-
@Autowired(required = false) SpringDataWebSettings settings;
50+
@Nullable //
51+
@Autowired(required = false) //
52+
SpringDataWebSettings settings;
5253

5354
@Bean
54-
public GeoModule jackson3GeoModule() {
55-
return new GeoModule();
55+
public GeoJacksonModule jackson3GeoModule() {
56+
return new GeoJacksonModule();
5657
}
5758

5859
@Bean

‎src/main/java/org/springframework/data/web/config/SpringDataWebConfiguration.java

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
*/
1616
package org.springframework.data.web.config;
1717

18-
import java.util.ArrayList;
18+
import tools.jackson.databind.json.JsonMapper;
19+
1920
import java.util.List;
2021

2122
import org.jspecify.annotations.Nullable;
@@ -40,18 +41,16 @@
4041
import org.springframework.data.web.XmlBeamHttpMessageConverter;
4142
import org.springframework.format.FormatterRegistry;
4243
import org.springframework.format.support.FormattingConversionService;
43-
import org.springframework.http.converter.HttpMessageConverter;
44-
import org.springframework.http.converter.HttpMessageConverters;
44+
import org.springframework.http.converter.HttpMessageConverters.ServerBuilder;
4545
import org.springframework.util.Assert;
4646
import org.springframework.util.ClassUtils;
4747
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
4848
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
4949

50-
5150
/**
5251
* Configuration class to register {@link PageableHandlerMethodArgumentResolver},
53-
* {@link SortHandlerMethodArgumentResolver}, {@link OffsetScrollPositionHandlerMethodArgumentResolver}
54-
* and {@link DomainClassConverter}.
52+
* {@link SortHandlerMethodArgumentResolver}, {@link OffsetScrollPositionHandlerMethodArgumentResolver} and
53+
* {@link DomainClassConverter}.
5554
*
5655
* @since 1.6
5756
* @author Oliver Gierke
@@ -91,7 +90,8 @@ public SpringDataWebConfiguration(ApplicationContext context,
9190
this.sortResolverCustomizer = Lazy.of( //
9291
() -> context.getBeanProvider(SortHandlerMethodArgumentResolverCustomizer.class).getIfAvailable());
9392
this.offsetResolverCustomizer = Lazy.of( //
94-
() -> context.getBeanProvider(OffsetScrollPositionHandlerMethodArgumentResolverCustomizer.class).getIfAvailable());
93+
() -> context.getBeanProvider(OffsetScrollPositionHandlerMethodArgumentResolverCustomizer.class)
94+
.getIfAvailable());
9595
}
9696

9797
@Override
@@ -153,31 +153,20 @@ public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentRes
153153
}
154154

155155
@Override
156-
public void configureMessageConverters(HttpMessageConverters.Builder builder) {
157-
158-
List<HttpMessageConverter<?>> converters = new ArrayList<>();
159-
configureMessageConverters(converters);
160-
161-
for (HttpMessageConverter<?> converter : converters) {
162-
builder.additionalMessageConverter(converter);
163-
}
164-
}
165-
166-
@Override
167-
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
156+
public void configureMessageConverters(ServerBuilder builder) {
168157

169158
if (ClassUtils.isPresent("com.jayway.jsonpath.DocumentContext", context.getClassLoader())) {
170159

171-
if (ClassUtils.isPresent("tools.jackson.databind.ObjectReader", context.getClassLoader())) {
160+
if (ClassUtils.isPresent("tools.jackson.databind.ObjectMapper", context.getClassLoader())) {
172161

173-
tools.jackson.databind.ObjectMapper mapper = context.getBeanProvider(tools.jackson.databind.ObjectMapper.class)
174-
.getIfUnique(tools.jackson.databind.ObjectMapper::new);
162+
JsonMapper mapper = context.getBeanProvider(JsonMapper.class).getIfUnique(JsonMapper::new);
175163

176164
ProjectingJacksonHttpMessageConverter converter = new ProjectingJacksonHttpMessageConverter(mapper);
177165
converter.setBeanFactory(context);
178166
forwardBeanClassLoader(converter);
179167

180-
converters.add(0, converter);
168+
builder.customMessageConverter(converter);
169+
181170
} else if (ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", context.getClassLoader())) {
182171

183172
com.fasterxml.jackson.databind.ObjectMapper mapper = context
@@ -188,13 +177,13 @@ public void configureMessageConverters(List<HttpMessageConverter<?>> converters)
188177
converter.setBeanFactory(context);
189178
forwardBeanClassLoader(converter);
190179

191-
converters.add(0, converter);
180+
builder.customMessageConverter(converter);
192181
}
193182
}
194183

195184
if (ClassUtils.isPresent("org.xmlbeam.XBProjector", context.getClassLoader())) {
196185

197-
converters.add(0, context.getBeanProvider(XmlBeamHttpMessageConverter.class) //
186+
builder.customMessageConverter(context.getBeanProvider(XmlBeamHttpMessageConverter.class) //
198187
.getIfAvailable(XmlBeamHttpMessageConverter::new));
199188
}
200189
}

‎src/test/java/org/springframework/data/web/config/EnableSpringDataWebSupportIntegrationTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ PageSampleController controller() {
134134
}
135135

136136
@Override
137-
protected void configureMessageConverters(HttpMessageConverters.Builder builder) {
137+
protected void configureMessageConverters(HttpMessageConverters.ServerBuilder builder) {
138138
builder.jsonMessageConverter(new JacksonJsonHttpMessageConverter(
139139
JsonMapper.builder().addModules(modules.toArray(new JacksonModule[0])).build()));
140140
}

‎src/test/java/org/springframework/data/web/config/SpringDataWebConfigurationIntegrationTests.java

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@
1616
package org.springframework.data.web.config;
1717

1818
import static org.assertj.core.api.Assertions.*;
19+
import static org.mockito.ArgumentMatchers.*;
1920
import static org.mockito.Mockito.*;
2021

2122
import tools.jackson.databind.ObjectMapper;
23+
import tools.jackson.databind.json.JsonMapper;
2224

2325
import java.util.ArrayList;
2426
import java.util.Arrays;
@@ -55,66 +57,66 @@ class SpringDataWebConfigurationIntegrationTests {
5557
@Test // DATACMNS-987
5658
void shouldNotLoadJacksonConverterWhenJacksonNotPresent() {
5759

58-
HttpMessageConverters.Builder builder = mock(HttpMessageConverters.Builder.class);
60+
HttpMessageConverters.ServerBuilder builder = mock(HttpMessageConverters.ServerBuilder.class);
5961

6062
createConfigWithClassLoader(
6163
HidingClassLoader.hide(ObjectMapper.class, com.fasterxml.jackson.databind.ObjectMapper.class),
6264
it -> it.configureMessageConverters(builder));
6365

64-
verify(builder).additionalMessageConverter(any(XmlBeamHttpMessageConverter.class));
66+
verify(builder).customMessageConverter(any(XmlBeamHttpMessageConverter.class));
6567
verifyNoMoreInteractions(builder);
6668
}
6769

6870
@Test // DATACMNS-987
6971
void shouldNotLoadJacksonConverterWhenJaywayNotPresent() {
7072

71-
HttpMessageConverters.Builder builder = mock(HttpMessageConverters.Builder.class);
73+
HttpMessageConverters.ServerBuilder builder = mock(HttpMessageConverters.ServerBuilder.class);
7274

7375
createConfigWithClassLoader(HidingClassLoader.hide(DocumentContext.class),
7476
it -> it.configureMessageConverters(builder));
7577

76-
verify(builder).additionalMessageConverter(any(XmlBeamHttpMessageConverter.class));
78+
verify(builder).customMessageConverter(any(XmlBeamHttpMessageConverter.class));
7779
verifyNoMoreInteractions(builder);
7880
}
7981

8082
@Test // DATACMNS-987
8183
void shouldNotLoadXBeamConverterWhenXBeamNotPresent() throws Exception {
8284

83-
HttpMessageConverters.Builder builder = mock(HttpMessageConverters.Builder.class);
85+
HttpMessageConverters.ServerBuilder builder = mock(HttpMessageConverters.ServerBuilder.class);
8486

8587
ClassLoader classLoader = HidingClassLoader.hide(XBProjector.class);
8688
createConfigWithClassLoader(classLoader, it -> it.configureMessageConverters(builder));
8789

88-
verify(builder, never()).additionalMessageConverter(any(XmlBeamHttpMessageConverter.class));
90+
verify(builder, never()).customMessageConverter(any(XmlBeamHttpMessageConverter.class));
8991
}
9092

9193
@Test // DATACMNS-987
9294
void shouldLoadAllConvertersWhenDependenciesArePresent() throws Exception {
9395

94-
HttpMessageConverters.Builder builder = mock(HttpMessageConverters.Builder.class);
96+
HttpMessageConverters.ServerBuilder builder = mock(HttpMessageConverters.ServerBuilder.class);
9597

9698
createConfigWithClassLoader(getClass().getClassLoader(), it -> it.configureMessageConverters(builder));
9799

98-
verify(builder).additionalMessageConverter(any(XmlBeamHttpMessageConverter.class));
99-
verify(builder).additionalMessageConverter(any(ProjectingJacksonHttpMessageConverter.class));
100+
verify(builder).customMessageConverter(any(XmlBeamHttpMessageConverter.class));
101+
verify(builder).customMessageConverter(any(ProjectingJacksonHttpMessageConverter.class));
100102
}
101103

102104
@Test // DATACMNS-1152
103105
void usesCustomObjectMapper() {
104106

105107
createConfigWithClassLoader(getClass().getClassLoader(), it -> {
106108

107-
HttpMessageConverters.Builder builder = mock(HttpMessageConverters.Builder.class);
109+
HttpMessageConverters.ServerBuilder builder = mock(HttpMessageConverters.ServerBuilder.class);
108110
ArgumentCaptor<HttpMessageConverter> captor = ArgumentCaptor.forClass(HttpMessageConverter.class);
109111

110112
it.configureMessageConverters(builder);
111-
verify(builder, atLeast(1)).additionalMessageConverter(captor.capture());
113+
verify(builder, atLeast(1)).customMessageConverter(captor.capture());
112114

113115
// Converters contains ProjectingJackson2HttpMessageConverter with custom ObjectMapper
114116

115117
assertThat(captor.getAllValues()).anySatisfy(converter -> {
116118
assertThat(converter).isInstanceOfSatisfying(ProjectingJacksonHttpMessageConverter.class, __ -> {
117-
assertThat(__.getObjectMapper()).isSameAs(SomeConfiguration.MAPPER);
119+
assertThat(__.getMapper()).isSameAs(SomeConfiguration.MAPPER);
118120
});
119121
});
120122
}, SomeConfiguration.class);
@@ -152,10 +154,10 @@ private static Class<?> loadWithout(Class<?> configurationClass, Class<?>... typ
152154
@Configuration
153155
static class SomeConfiguration {
154156

155-
static ObjectMapper MAPPER = new ObjectMapper();
157+
static JsonMapper MAPPER = new JsonMapper();
156158

157159
@Bean
158-
ObjectMapper mapper() {
160+
JsonMapper mapper() {
159161
return MAPPER;
160162
}
161163
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /