Skip to content

Commit 3f96852

Browse files
GH-2099 - Declare the dependency between shared session creator and entity instantiator.
The conversion service is picked up to late as the the dependency between the shared session creator and the bean that does the post processing of the underlying session factory is undefined for the Spring context. By explicit stating this in the repository extension, the `Neo4jOgmEntityInstantiatorConfigurationBean` is correctly initialized upfront without messing around with an actual post processor or orderings. This closes #2099.
1 parent 2dd7b06 commit 3f96852

File tree

2 files changed

+45
-14
lines changed

2 files changed

+45
-14
lines changed

spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/config/Neo4jOgmEntityInstantiatorConfigurationBean.java

+23-4
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,44 @@
1515
*/
1616
package org.springframework.data.neo4j.repository.config;
1717

18+
import javax.annotation.PostConstruct;
19+
1820
import org.neo4j.ogm.metadata.MetaData;
1921
import org.neo4j.ogm.session.SessionFactory;
2022
import org.neo4j.ogm.typeconversion.ConversionCallback;
23+
import org.springframework.beans.BeansException;
24+
import org.springframework.beans.factory.InitializingBean;
2125
import org.springframework.beans.factory.ObjectProvider;
26+
import org.springframework.beans.factory.config.BeanPostProcessor;
27+
import org.springframework.core.Ordered;
28+
import org.springframework.core.PriorityOrdered;
2229
import org.springframework.core.convert.ConversionService;
2330
import org.springframework.data.neo4j.conversion.MetaDataDrivenConversionService;
2431
import org.springframework.data.neo4j.conversion.Neo4jOgmEntityInstantiatorAdapter;
2532
import org.springframework.data.neo4j.mapping.Neo4jMappingContext;
2633

2734
/**
28-
*
2935
* @author Gerrit Meier
3036
* @author Michael J. Simons
3137
*/
32-
class Neo4jOgmEntityInstantiatorConfigurationBean {
38+
class Neo4jOgmEntityInstantiatorConfigurationBean implements InitializingBean {
39+
40+
private final SessionFactory sessionFactory;
41+
private final Neo4jMappingContext mappingContext;
42+
private final ObjectProvider<ConversionService> conversionServiceObjectProvider;
3343

34-
public Neo4jOgmEntityInstantiatorConfigurationBean(SessionFactory sessionFactory, Neo4jMappingContext mappingContext,
35-
ObjectProvider<ConversionService> conversionServiceObjectProvider) {
44+
public Neo4jOgmEntityInstantiatorConfigurationBean(
45+
SessionFactory sessionFactory, Neo4jMappingContext mappingContext,
46+
ObjectProvider<ConversionService> conversionServiceObjectProvider
47+
) {
48+
49+
this.sessionFactory = sessionFactory;
50+
this.mappingContext = mappingContext;
51+
this.conversionServiceObjectProvider = conversionServiceObjectProvider;
52+
}
3653

54+
@Override
55+
public void afterPropertiesSet() {
3756
MetaData metaData = sessionFactory.metaData();
3857
ConversionService conversionService = conversionServiceObjectProvider
3958
.getIfUnique(() -> new MetaDataDrivenConversionService(metaData));

spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/config/Neo4jRepositoryConfigurationExtension.java

+22-10
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323

2424
import org.neo4j.ogm.annotation.NodeEntity;
2525
import org.neo4j.ogm.annotation.RelationshipEntity;
26+
import org.springframework.beans.factory.annotation.Autowire;
27+
import org.springframework.beans.factory.annotation.Autowired;
2628
import org.springframework.beans.factory.annotation.Qualifier;
2729
import org.springframework.beans.factory.support.AbstractBeanDefinition;
2830
import org.springframework.beans.factory.support.AutowireCandidateQualifier;
@@ -189,23 +191,29 @@ public void registerBeansForRoot(BeanDefinitionRegistry registry, RepositoryConf
189191
return;
190192
}
191193

194+
String configuredMappingContextBeanName = config.getAttribute("mappingContextBeanName").orElse(GENERATE_BEAN_NAME);
192195
String configuredSessionBeanName = config.getAttribute("sessionBeanName").orElse(GENERATE_BEAN_NAME);
193-
this.sessionBeanName = registerWithGeneratedNameOrUseConfigured(createSharedSessionCreatorBeanDefinition(config),
194-
registry, configuredSessionBeanName, source);
195196

196-
String configuredMappingContextBeanName = config.getAttribute("mappingContextBeanName").orElse(GENERATE_BEAN_NAME);
197+
// Register mapping context
197198
this.neo4jMappingContextBeanName = registerWithGeneratedNameOrUseConfigured(
198199
createNeo4jMappingContextFactoryBeanDefinition(config), registry, configuredMappingContextBeanName, source);
199200

200-
registerIfNotAlreadyRegistered(() -> new RootBeanDefinition(Neo4jPersistenceExceptionTranslator.class), registry,
201-
NEO4J_PERSISTENCE_EXCEPTION_TRANSLATOR_NAME, source);
202-
201+
// Prepare session factory postprocessor
203202
AbstractBeanDefinition rootBeanDefinition = BeanDefinitionBuilder
204203
.rootBeanDefinition(Neo4jOgmEntityInstantiatorConfigurationBean.class)
205-
.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE)
204+
.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_CONSTRUCTOR)
206205
.addConstructorArgReference(getSessionFactoryBeanName(config))
207-
.addConstructorArgReference(this.neo4jMappingContextBeanName).getBeanDefinition();
208-
registerWithGeneratedNameOrUseConfigured(rootBeanDefinition, registry, GENERATE_BEAN_NAME, source);
206+
.addConstructorArgReference(this.neo4jMappingContextBeanName)
207+
.getBeanDefinition();
208+
String sessionFactoryPostProcessorBeanName = registerWithGeneratedNameOrUseConfigured(
209+
rootBeanDefinition, registry, GENERATE_BEAN_NAME, source);
210+
211+
// Make sure the shared session creator depends on it
212+
this.sessionBeanName = registerWithGeneratedNameOrUseConfigured(
213+
createSharedSessionCreatorBeanDefinition(config, sessionFactoryPostProcessorBeanName), registry, configuredSessionBeanName, source);
214+
215+
registerIfNotAlreadyRegistered(() -> new RootBeanDefinition(Neo4jPersistenceExceptionTranslator.class), registry,
216+
NEO4J_PERSISTENCE_EXCEPTION_TRANSLATOR_NAME, source);
209217
}
210218

211219
/**
@@ -236,13 +244,17 @@ private static String registerWithGeneratedNameOrUseConfigured(AbstractBeanDefin
236244
return registeredBeanName;
237245
}
238246

239-
private static AbstractBeanDefinition createSharedSessionCreatorBeanDefinition(RepositoryConfigurationSource config) {
247+
private static AbstractBeanDefinition createSharedSessionCreatorBeanDefinition(
248+
RepositoryConfigurationSource config,
249+
String sessionFactoryPostProcessorBeanName
250+
) {
240251

241252
String sessionFactoryBeanName = getSessionFactoryBeanName(config);
242253

243254
AbstractBeanDefinition sharedSessionCreatorBeanDefinition = BeanDefinitionBuilder //
244255
.rootBeanDefinition(SharedSessionCreator.class, "createSharedSession") //
245256
.addConstructorArgReference(sessionFactoryBeanName) //
257+
.addDependsOn(sessionFactoryPostProcessorBeanName)
246258
.getBeanDefinition();
247259

248260
sharedSessionCreatorBeanDefinition

0 commit comments

Comments
 (0)