diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/support/SubReferenceNodeTypeStrategy.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/support/SubReferenceNodeTypeStrategy.java index 2f8083db3..6aa094180 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/support/SubReferenceNodeTypeStrategy.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/support/SubReferenceNodeTypeStrategy.java @@ -153,7 +153,10 @@ public class SubReferenceNodeTypeStrategy implements NodeTypeStrategy { @Override @SuppressWarnings("unchecked") public Class getJavaType(Node node) { - Node subrefNode = node.getSingleRelationship(INSTANCE_OF_RELATIONSHIP_TYPE, Direction.OUTGOING).getEndNode(); + if (node==null) throw new IllegalArgumentException("Node is null"); + Relationship instanceOfRelationship = node.getSingleRelationship(INSTANCE_OF_RELATIONSHIP_TYPE, Direction.OUTGOING); + if (instanceOfRelationship==null) throw new IllegalArgumentException("The node "+node+" is not attached to a type hierarchy."); + Node subrefNode = instanceOfRelationship.getEndNode(); try { Class clazz = (Class) Class.forName((String) subrefNode.getProperty(SUBREF_CLASS_KEY)).asSubclass(NodeBacked.class); if (log.isDebugEnabled()) log.debug("Found class " + clazz.getSimpleName() + " for node: " + node); diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/graph/neo4j/support/SubReferenceNodeTypeStrategyTest.java b/spring-data-neo4j/src/test/java/org/springframework/data/graph/neo4j/support/SubReferenceNodeTypeStrategyTest.java index 27fe82960..ad40b5fb0 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/graph/neo4j/support/SubReferenceNodeTypeStrategyTest.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/graph/neo4j/support/SubReferenceNodeTypeStrategyTest.java @@ -73,6 +73,22 @@ public class SubReferenceNodeTypeStrategyTest { Assert.assertEquals("type node has property of type Thing.class", Thing.class.getName(), typeNode.getProperty(SubReferenceNodeTypeStrategy.SUBREF_CLASS_KEY)); Assert.assertEquals("one thing has been created", 1, typeNode.getProperty(SubReferenceNodeTypeStrategy.SUBREFERENCE_NODE_COUNTER_KEY)); } + @Test(expected = IllegalArgumentException.class) + public void gettingTypeFromNonTypeNodeShouldThrowAnDescriptiveException() throws Exception { + Node referenceNode = graphDatabaseContext.getReferenceNode(); + nodeTypeStrategy.getJavaType(referenceNode); + } + + @Test(expected = IllegalArgumentException.class) + public void confirmingTypeOfNonTypeNodeShouldThrowAnDescriptiveException() throws Exception { + Node referenceNode = graphDatabaseContext.getReferenceNode(); + nodeTypeStrategy.confirmType(referenceNode,Thing.class); + } + + @Test(expected = IllegalArgumentException.class) + public void gettingTypeFromNullShouldFail() throws Exception { + nodeTypeStrategy.getJavaType(null); + } private Node createThing() { Transaction tx = graphDatabaseContext.beginTx();