diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/annotation/EndNode.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/annotation/EndNode.java
index 1c1c215cb..c53f5b5e6 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/annotation/EndNode.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/annotation/EndNode.java
@@ -16,6 +16,8 @@
package org.springframework.data.neo4j.annotation;
+import org.springframework.data.annotation.Reference;
+
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -30,5 +32,6 @@ import java.lang.annotation.Target;
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.METHOD})
+@Reference
public @interface EndNode {
}
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/annotation/StartNode.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/annotation/StartNode.java
index 44709b0ac..38d508869 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/annotation/StartNode.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/annotation/StartNode.java
@@ -16,6 +16,8 @@
package org.springframework.data.neo4j.annotation;
+import org.springframework.data.annotation.Reference;
+
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -30,5 +32,6 @@ import java.lang.annotation.Target;
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.METHOD})
+@Reference
public @interface StartNode {
}
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/Neo4jConfiguration.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/Neo4jConfiguration.java
index 69e30dd02..494aecf49 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/Neo4jConfiguration.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/config/Neo4jConfiguration.java
@@ -28,13 +28,15 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.ConversionService;
import org.springframework.dao.support.PersistenceExceptionTranslator;
+import org.springframework.data.convert.DefaultTypeMapper;
+import org.springframework.data.convert.TypeMapper;
import org.springframework.data.neo4j.core.GraphDatabase;
+import org.springframework.data.neo4j.core.TypeRepresentationStrategy;
import org.springframework.data.neo4j.fieldaccess.DelegatingFieldAccessorFactory;
import org.springframework.data.neo4j.fieldaccess.Neo4jConversionServiceFactoryBean;
import org.springframework.data.neo4j.fieldaccess.NodeDelegatingFieldAccessorFactory;
import org.springframework.data.neo4j.fieldaccess.RelationshipDelegatingFieldAccessorFactory;
-import org.springframework.data.neo4j.mapping.Neo4jMappingContext;
-import org.springframework.data.neo4j.mapping.Neo4jNodeConverterImpl;
+import org.springframework.data.neo4j.mapping.*;
import org.springframework.data.neo4j.repository.DirectGraphRepositoryFactory;
import org.springframework.data.neo4j.support.DelegatingGraphDatabase;
import org.springframework.data.neo4j.support.EntityInstantiator;
@@ -53,6 +55,8 @@ import org.springframework.transaction.jta.UserTransactionAdapter;
import javax.annotation.PostConstruct;
import javax.validation.Validator;
+import static java.util.Arrays.asList;
+
/**
* Abstract base class for code based configuration of Spring managed Neo4j infrastructure.
* Subclasses are required to provide an implementation of graphDbService ....
@@ -78,20 +82,15 @@ public abstract class Neo4jConfiguration {
@Bean
public GraphDatabaseContext graphDatabaseContext() throws Exception {
- EntityInstantiator relationshipEntityInstantiator = graphRelationshipInstantiator();
- EntityInstantiator graphEntityInstantiator = graphEntityInstantiator();
-
- TypeRepresentationStrategyFactory typeRepresentationStrategyFactory =
- new TypeRepresentationStrategyFactory(graphDatabaseService, graphEntityInstantiator, relationshipEntityInstantiator);
GraphDatabaseContext gdc = new GraphDatabaseContext();
gdc.setGraphDatabaseService(getGraphDatabaseService());
gdc.setConversionService(conversionService());
gdc.setMappingContext(mappingContext());
- gdc.setConverter(neo4jConverter());
+ gdc.setNodeEntityConverter(nodeEntityConverter());
gdc.setEntityStateHandler(entityStateHandler());
- gdc.setNodeTypeRepresentationStrategy(typeRepresentationStrategyFactory.getNodeTypeRepresentationStrategy());
- gdc.setRelationshipTypeRepresentationStrategy(typeRepresentationStrategyFactory.getRelationshipTypeRepresentationStrategy());
+ gdc.setNodeTypeRepresentationStrategy(nodeTypeRepresentationStrategy());
+ gdc.setRelationshipTypeRepresentationStrategy(relationshipTypeRepresentationStrategy());
if (validator!=null) {
gdc.setValidator(validator);
}
@@ -99,13 +98,45 @@ public abstract class Neo4jConfiguration {
}
@Bean
- public EntityStateHandler entityStateHandler() {
- return new EntityStateHandler(mappingContext(),graphDatabaseService);
+ public TypeRepresentationStrategy relationshipTypeRepresentationStrategy() throws Exception {
+ return typeRepresentationStrategyFactory().getRelationshipTypeRepresentationStrategy();
}
@Bean
- public Neo4jNodeConverterImpl neo4jConverter() throws Exception {
- return new Neo4jNodeConverterImpl();
+ public TypeRepresentationStrategy nodeTypeRepresentationStrategy() throws Exception {
+ return typeRepresentationStrategyFactory().getNodeTypeRepresentationStrategy();
+ }
+
+ @Bean
+ public TypeRepresentationStrategyFactory typeRepresentationStrategyFactory() throws Exception {
+ return new TypeRepresentationStrategyFactory(graphDatabaseService, graphEntityInstantiator(), graphRelationshipInstantiator());
+ }
+
+ @Bean
+ public EntityStateHandler entityStateHandler() {
+ return new EntityStateHandler(mappingContext(),graphDatabaseService);
+ }
+
+ @Bean
+ public Neo4jEntityConverter