Skip to content

Commit 9a9c2bf

Browse files
committed
Do not register SpringDataWebSettings if pageSerializationMode is default
allow application to register their own SpringDataWebSettings without @primary see spring-projects/spring-boot#39797 (comment)
1 parent f7a1066 commit 9a9c2bf

File tree

3 files changed

+18
-3
lines changed

3 files changed

+18
-3
lines changed

src/main/java/org/springframework/data/web/config/EnableSpringDataWebSupport.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
* @see SpringDataWebConfiguration
7070
* @see HateoasAwareSpringDataWebConfiguration
7171
* @author Oliver Gierke
72+
* @author Yanming Zhou
7273
*/
7374
@Retention(RetentionPolicy.RUNTIME)
7475
@Target({ ElementType.TYPE, ElementType.ANNOTATION_TYPE })
@@ -190,8 +191,16 @@ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, B
190191
return;
191192
}
192193

194+
Object pageSerializationMode = attributes.get("pageSerializationMode");
195+
196+
if (pageSerializationMode == PageSerializationMode.DIRECT) {
197+
// do not register SpringDataWebSettings if pageSerializationMode is default
198+
// allow application to register their own SpringDataWebSettings without @Primary
199+
return;
200+
}
201+
193202
AbstractBeanDefinition definition = BeanDefinitionBuilder.rootBeanDefinition(SpringDataWebSettings.class)
194-
.addConstructorArgValue(attributes.get("pageSerializationMode"))
203+
.addConstructorArgValue(pageSerializationMode)
195204
.getBeanDefinition();
196205

197206
String beanName = importBeanNameGenerator.generateBeanName(definition, registry);

src/main/java/org/springframework/data/web/config/SpringDataJacksonConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
* JavaConfig class to export Jackson specific configuration.
3838
*
3939
* @author Oliver Gierke
40+
* @author Yanming Zhou
4041
*/
4142
public class SpringDataJacksonConfiguration implements SpringDataJacksonModules {
4243

@@ -84,7 +85,7 @@ public PageModule(@Nullable SpringDataWebSettings settings) {
8485

8586
addSerializer(UNPAGED_TYPE, new UnpagedAsInstanceSerializer());
8687

87-
if (settings != null && settings.pageSerializationMode() == PageSerializationMode.DIRECT) {
88+
if (settings == null || settings.pageSerializationMode() == PageSerializationMode.DIRECT) {
8889
setMixInAnnotation(PageImpl.class, WarningMixing.class);
8990
} else {
9091
setMixInAnnotation(PageImpl.class, WrappingMixing.class);

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import org.junit.jupiter.api.Test;
2626

27+
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
2728
import org.springframework.beans.factory.annotation.Autowired;
2829
import org.springframework.context.ApplicationContext;
2930
import org.springframework.context.annotation.Bean;
@@ -67,7 +68,7 @@ class EnableSpringDataWebSupportIntegrationTests {
6768

6869
@Configuration
6970
@EnableWebMvc
70-
@EnableSpringDataWebSupport
71+
@EnableSpringDataWebSupport(pageSerializationMode = EnableSpringDataWebSupport.PageSerializationMode.VIA_DTO)
7172
static class SampleConfig {
7273

7374
@Bean
@@ -304,6 +305,10 @@ void registersSpringDataWebSettingsBean() {
304305
void usesDirectPageSerializationMode() throws Exception {
305306

306307
var applicationContext = WebTestUtils.createApplicationContext(PageSampleConfigWithDirect.class);
308+
309+
// SpringDataWebSettings shouldn't be registered if pageSerializationMode is default
310+
assertThatExceptionOfType(NoSuchBeanDefinitionException.class).isThrownBy(() -> applicationContext.getBean(SpringDataWebSettings.class));
311+
307312
var mvc = MockMvcBuilders.webAppContextSetup(applicationContext).build();
308313

309314
mvc.perform(post("/page"))//

0 commit comments

Comments
 (0)