From 9a9c2bf92634baa695f2a850b4dc7aae4150c041 Mon Sep 17 00:00:00 2001 From: Yanming Zhou Date: Fri, 1 Mar 2024 10:18:39 +0800 Subject: [PATCH] Do not register SpringDataWebSettings if pageSerializationMode is default allow application to register their own SpringDataWebSettings without @Primary see https://github.com/spring-projects/spring-boot/pull/39797#discussion_r1508396169 --- .../data/web/config/EnableSpringDataWebSupport.java | 11 ++++++++++- .../web/config/SpringDataJacksonConfiguration.java | 3 ++- .../EnableSpringDataWebSupportIntegrationTests.java | 7 ++++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/springframework/data/web/config/EnableSpringDataWebSupport.java b/src/main/java/org/springframework/data/web/config/EnableSpringDataWebSupport.java index de6f4e44bd..9a0452c9ce 100644 --- a/src/main/java/org/springframework/data/web/config/EnableSpringDataWebSupport.java +++ b/src/main/java/org/springframework/data/web/config/EnableSpringDataWebSupport.java @@ -69,6 +69,7 @@ * @see SpringDataWebConfiguration * @see HateoasAwareSpringDataWebConfiguration * @author Oliver Gierke + * @author Yanming Zhou */ @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.TYPE, ElementType.ANNOTATION_TYPE }) @@ -190,8 +191,16 @@ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, B return; } + Object pageSerializationMode = attributes.get("pageSerializationMode"); + + if (pageSerializationMode == PageSerializationMode.DIRECT) { + // do not register SpringDataWebSettings if pageSerializationMode is default + // allow application to register their own SpringDataWebSettings without @Primary + return; + } + AbstractBeanDefinition definition = BeanDefinitionBuilder.rootBeanDefinition(SpringDataWebSettings.class) - .addConstructorArgValue(attributes.get("pageSerializationMode")) + .addConstructorArgValue(pageSerializationMode) .getBeanDefinition(); String beanName = importBeanNameGenerator.generateBeanName(definition, registry); diff --git a/src/main/java/org/springframework/data/web/config/SpringDataJacksonConfiguration.java b/src/main/java/org/springframework/data/web/config/SpringDataJacksonConfiguration.java index 131357db59..f699dfa64e 100644 --- a/src/main/java/org/springframework/data/web/config/SpringDataJacksonConfiguration.java +++ b/src/main/java/org/springframework/data/web/config/SpringDataJacksonConfiguration.java @@ -37,6 +37,7 @@ * JavaConfig class to export Jackson specific configuration. * * @author Oliver Gierke + * @author Yanming Zhou */ public class SpringDataJacksonConfiguration implements SpringDataJacksonModules { @@ -84,7 +85,7 @@ public PageModule(@Nullable SpringDataWebSettings settings) { addSerializer(UNPAGED_TYPE, new UnpagedAsInstanceSerializer()); - if (settings != null && settings.pageSerializationMode() == PageSerializationMode.DIRECT) { + if (settings == null || settings.pageSerializationMode() == PageSerializationMode.DIRECT) { setMixInAnnotation(PageImpl.class, WarningMixing.class); } else { setMixInAnnotation(PageImpl.class, WrappingMixing.class); diff --git a/src/test/java/org/springframework/data/web/config/EnableSpringDataWebSupportIntegrationTests.java b/src/test/java/org/springframework/data/web/config/EnableSpringDataWebSupportIntegrationTests.java index a0fb2bae2c..75ca7709d3 100755 --- a/src/test/java/org/springframework/data/web/config/EnableSpringDataWebSupportIntegrationTests.java +++ b/src/test/java/org/springframework/data/web/config/EnableSpringDataWebSupportIntegrationTests.java @@ -24,6 +24,7 @@ import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; @@ -67,7 +68,7 @@ class EnableSpringDataWebSupportIntegrationTests { @Configuration @EnableWebMvc - @EnableSpringDataWebSupport + @EnableSpringDataWebSupport(pageSerializationMode = EnableSpringDataWebSupport.PageSerializationMode.VIA_DTO) static class SampleConfig { @Bean @@ -304,6 +305,10 @@ void registersSpringDataWebSettingsBean() { void usesDirectPageSerializationMode() throws Exception { var applicationContext = WebTestUtils.createApplicationContext(PageSampleConfigWithDirect.class); + + // SpringDataWebSettings shouldn't be registered if pageSerializationMode is default + assertThatExceptionOfType(NoSuchBeanDefinitionException.class).isThrownBy(() -> applicationContext.getBean(SpringDataWebSettings.class)); + var mvc = MockMvcBuilders.webAppContextSetup(applicationContext).build(); mvc.perform(post("/page"))//