From e0a5de01caf3d34acc19d0f4ac75bf214819bcd7 Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Mon, 25 Sep 2023 12:14:51 +0200 Subject: [PATCH 1/2] Use Neo4jManagedTypes to populate the mapping context See gh-37574 --- .../data/neo4j/Neo4jDataAutoConfiguration.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfiguration.java index dd72cf323d..55508a7c94 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfiguration.java @@ -33,6 +33,7 @@ import org.springframework.boot.autoconfigure.transaction.TransactionManagerCust import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; +import org.springframework.data.neo4j.aot.Neo4jManagedTypes; import org.springframework.data.neo4j.core.DatabaseSelectionProvider; import org.springframework.data.neo4j.core.Neo4jClient; import org.springframework.data.neo4j.core.Neo4jOperations; @@ -71,12 +72,18 @@ public class Neo4jDataAutoConfiguration { @Bean @ConditionalOnMissingBean - public Neo4jMappingContext neo4jMappingContext(ApplicationContext applicationContext, - Neo4jConversions neo4jConversions) throws ClassNotFoundException { + Neo4jManagedTypes neo4jManagedTypes(ApplicationContext applicationContext) throws ClassNotFoundException { Set> initialEntityClasses = new EntityScanner(applicationContext).scan(Node.class, RelationshipProperties.class); + return Neo4jManagedTypes.fromIterable(initialEntityClasses); + } + + @Bean + @ConditionalOnMissingBean + public Neo4jMappingContext neo4jMappingContext(Neo4jManagedTypes managedTypes, Neo4jConversions neo4jConversions) { + Neo4jMappingContext context = new Neo4jMappingContext(neo4jConversions); - context.setInitialEntitySet(initialEntityClasses); + context.setManagedTypes(managedTypes); return context; } From 6b107530f521b61c8057a108c3ec6b2ff053ac37 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Wed, 27 Sep 2023 09:32:53 +0100 Subject: [PATCH 2/2] Polish "Use Neo4jManagedTypes to populate the mapping context" See gh-37574 --- .../neo4j/Neo4jDataAutoConfiguration.java | 3 +-- .../Neo4jDataAutoConfigurationTests.java | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfiguration.java index 55508a7c94..742577d68a 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -81,7 +81,6 @@ public class Neo4jDataAutoConfiguration { @Bean @ConditionalOnMissingBean public Neo4jMappingContext neo4jMappingContext(Neo4jManagedTypes managedTypes, Neo4jConversions neo4jConversions) { - Neo4jMappingContext context = new Neo4jMappingContext(neo4jConversions); context.setManagedTypes(managedTypes); return context; diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfigurationTests.java index 2b3aeb38d4..76dc81f42e 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfigurationTests.java @@ -29,6 +29,7 @@ import org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.data.neo4j.aot.Neo4jManagedTypes; import org.springframework.data.neo4j.core.DatabaseSelection; import org.springframework.data.neo4j.core.DatabaseSelectionProvider; import org.springframework.data.neo4j.core.Neo4jClient; @@ -37,6 +38,7 @@ import org.springframework.data.neo4j.core.Neo4jTemplate; import org.springframework.data.neo4j.core.convert.Neo4jConversions; import org.springframework.data.neo4j.core.mapping.Neo4jMappingContext; import org.springframework.data.neo4j.core.transaction.Neo4jTransactionManager; +import org.springframework.test.util.ReflectionTestUtils; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.ReactiveTransactionManager; import org.springframework.transaction.TransactionManager; @@ -162,6 +164,29 @@ class Neo4jDataAutoConfigurationTests { }); } + @Test + void shouldProvideManagedTypes() { + this.contextRunner.run((context) -> { + assertThat(context).hasSingleBean(Neo4jManagedTypes.class); + assertThat(context.getBean(Neo4jMappingContext.class)) + .extracting((mappingContext) -> ReflectionTestUtils.getField(mappingContext, "managedTypes")) + .isEqualTo(context.getBean(Neo4jManagedTypes.class)); + }); + } + + @Test + void shouldReuseExistingManagedTypes() { + Neo4jManagedTypes managedTypes = Neo4jManagedTypes.from(); + this.contextRunner.withBean("customManagedTypes", Neo4jManagedTypes.class, () -> managedTypes) + .run((context) -> { + assertThat(context).hasSingleBean(Neo4jManagedTypes.class); + assertThat(context).doesNotHaveBean("neo4jManagedTypes"); + assertThat(context.getBean(Neo4jMappingContext.class)) + .extracting((mappingContext) -> ReflectionTestUtils.getField(mappingContext, "managedTypes")) + .isSameAs(managedTypes); + }); + } + @Configuration(proxyBeanMethods = false) static class CustomDatabaseSelectionProviderConfiguration {