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:
Gerrit Meier
2018-01-25 13:15:53 +01:00
parent 24935c3d6c
commit 0182dbf3c7
3 changed files with 47 additions and 24 deletions

View File

@@ -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;
}

View File

@@ -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;
}
}

View File

@@ -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);
}
}
}