DATAGRAPH-1064 - Instantiate OgmEntityInstantiator later.
Extract the instantiation of OgmEntityInstantiator after the mapping context got created. Do not require an existing ConversionService but instantiate a fallback to MetaDataDrivenConversionService. (cherry picked from commit 010e336)
This commit is contained in:
@@ -14,19 +14,13 @@
|
||||
package org.springframework.data.neo4j.repository.config;
|
||||
|
||||
import org.neo4j.ogm.session.SessionFactory;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.BeansException;
|
||||
import org.springframework.beans.DirectFieldAccessor;
|
||||
import org.springframework.beans.factory.FactoryBean;
|
||||
import org.springframework.beans.factory.ListableBeanFactory;
|
||||
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
||||
import org.springframework.beans.factory.config.AbstractFactoryBean;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.ApplicationContextAware;
|
||||
import org.springframework.core.convert.ConversionService;
|
||||
import org.springframework.data.neo4j.mapping.Neo4jMappingContext;
|
||||
import org.springframework.util.ClassUtils;
|
||||
|
||||
/**
|
||||
* {@link FactoryBean} to setup {@link Neo4jMappingContext} instances from Spring configuration.
|
||||
@@ -37,9 +31,6 @@ import org.springframework.util.ClassUtils;
|
||||
public class Neo4jMappingContextFactoryBean extends AbstractFactoryBean<Neo4jMappingContext> implements
|
||||
ApplicationContextAware {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(Neo4jMappingContextFactoryBean.class);
|
||||
private static final boolean HAS_ENTITY_INSTANTIATOR_FEATURE = ClassUtils.isPresent("org.neo4j.ogm.session.EntityInstantiator",
|
||||
Neo4jMappingContextFactoryBean.class.getClassLoader());
|
||||
private ListableBeanFactory beanFactory;
|
||||
|
||||
/*
|
||||
@@ -66,22 +57,9 @@ public class Neo4jMappingContextFactoryBean extends AbstractFactoryBean<Neo4jMap
|
||||
*/
|
||||
@Override
|
||||
protected Neo4jMappingContext createInstance() {
|
||||
|
||||
SessionFactory sessionFactory = beanFactory.getBean(SessionFactory.class);
|
||||
Neo4jMappingContext context = new Neo4jMappingContext(sessionFactory.metaData());
|
||||
context.initialize();
|
||||
|
||||
if (HAS_ENTITY_INSTANTIATOR_FEATURE) {
|
||||
ConversionService conversionService = null;
|
||||
try {
|
||||
conversionService = beanFactory.getBean(ConversionService.class);
|
||||
} catch (NoSuchBeanDefinitionException e) {
|
||||
LOG.debug("Unable to find a conversion service to use for entity instantiation, using none");
|
||||
}
|
||||
new DirectFieldAccessor(sessionFactory).setPropertyValue("entityInstantiator",
|
||||
new OgmEntityInstantiatorAdapter(context, conversionService));
|
||||
}
|
||||
|
||||
return context;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
package org.springframework.data.neo4j.repository.config;
|
||||
|
||||
import org.neo4j.ogm.session.SessionFactory;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.core.convert.ConversionService;
|
||||
import org.springframework.data.neo4j.conversion.MetaDataDrivenConversionService;
|
||||
import org.springframework.data.neo4j.mapping.Neo4jMappingContext;
|
||||
|
||||
public class Neo4jOgmEntityInstantiatorConfigurationBean implements InitializingBean {
|
||||
|
||||
private final SessionFactory sessionFactory;
|
||||
private final Neo4jMappingContext mappingContext;
|
||||
private ConversionService conversionService;
|
||||
|
||||
@Autowired
|
||||
public Neo4jOgmEntityInstantiatorConfigurationBean(SessionFactory sessionFactory, Neo4jMappingContext mappingContext) {
|
||||
this.sessionFactory = sessionFactory;
|
||||
this.mappingContext = mappingContext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() {
|
||||
sessionFactory.setEntityInstantiator(
|
||||
new OgmEntityInstantiatorAdapter(
|
||||
mappingContext,
|
||||
conversionService != null ? conversionService : new MetaDataDrivenConversionService(sessionFactory.metaData()))
|
||||
);
|
||||
}
|
||||
|
||||
@Autowired(required = false)
|
||||
public void setConversionService(ConversionService conversionService) {
|
||||
this.conversionService = conversionService;
|
||||
}
|
||||
}
|
||||
@@ -20,7 +20,8 @@ import java.util.Optional;
|
||||
|
||||
import org.neo4j.ogm.annotation.NodeEntity;
|
||||
import org.neo4j.ogm.annotation.RelationshipEntity;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
||||
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
||||
import org.springframework.beans.factory.support.RootBeanDefinition;
|
||||
@@ -34,6 +35,7 @@ import org.springframework.data.repository.config.AnnotationRepositoryConfigurat
|
||||
import org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport;
|
||||
import org.springframework.data.repository.config.RepositoryConfigurationSource;
|
||||
import org.springframework.data.repository.config.XmlRepositoryConfigurationSource;
|
||||
import org.springframework.util.ClassUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
@@ -50,9 +52,11 @@ public class Neo4jRepositoryConfigurationExtension extends RepositoryConfigurati
|
||||
|
||||
private static final String DEFAULT_TRANSACTION_MANAGER_BEAN_NAME = "transactionManager";
|
||||
private static final String NEO4J_MAPPING_CONTEXT_BEAN_NAME = "neo4jMappingContext";
|
||||
private static final String NEO4J_ENTITY_INSTANTIATOR_CONFIGURATION_BEAN_NAME = "neo4jOgmEntityInstantiatorConfigurationBean";
|
||||
private static final String ENABLE_DEFAULT_TRANSACTIONS_ATTRIBUTE = "enableDefaultTransactions";
|
||||
private static final String SESSION_BEAN_DEFINITION_REGISTRAR_POST_PROCESSOR_BEAN_NAME = "sessionBeanDefinitionRegistrarPostProcessor";
|
||||
|
||||
private static final boolean HAS_ENTITY_INSTANTIATOR_FEATURE = ClassUtils.isPresent("org.neo4j.ogm.session.EntityInstantiator",
|
||||
Neo4jMappingContextFactoryBean.class.getClassLoader());
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport#getModuleName()
|
||||
@@ -159,5 +163,11 @@ public class Neo4jRepositoryConfigurationExtension extends RepositoryConfigurati
|
||||
|
||||
registerIfNotAlreadyRegistered(new RootBeanDefinition(Neo4jMappingContextFactoryBean.class), registry,
|
||||
NEO4J_MAPPING_CONTEXT_BEAN_NAME, source);
|
||||
|
||||
if (HAS_ENTITY_INSTANTIATOR_FEATURE) {
|
||||
registerIfNotAlreadyRegistered(new RootBeanDefinition(Neo4jOgmEntityInstantiatorConfigurationBean.class),
|
||||
registry, NEO4J_ENTITY_INSTANTIATOR_CONFIGURATION_BEAN_NAME, source);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user