Today I migrated neo4j-ogm to the most recent version (3.0.1). I followed all recommendations but now when I try to query an entity I get a MappingException as the systems seems not able to find the Entity class. After further investigation and reading this question I tried to query in an HTTP POST response and it worked fine so it does seem to be a problem of using the neo4j-ogm Session to query inside a GET HTTP response as suggested in that other question answer. Any ideas on what might be going on here?
The Exception looks like:
play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[MappingException: Error mapping GraphModel to instance of nodes.UserNode]]
at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:255)
at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:180)
at play.core.server.AkkaHttpServer$$anonfun$13$$anonfun$apply$1.applyOrElse(AkkaHttpServer.scala:251)
at play.core.server.AkkaHttpServer$$anonfun$13$$anonfun$apply$1.applyOrElse(AkkaHttpServer.scala:250)
at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:346)
at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:345)
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
at play.api.libs.streams.Execution$trampoline$.execute(Execution.scala:70)
at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:40)
at scala.concurrent.impl.Promise$DefaultPromise.scala$concurrent$impl$Promise$DefaultPromise$$dispatchOrAddCallback(Promise.scala:280)
Caused by: org.neo4j.ogm.exception.core.MappingException: Error mapping GraphModel to instance of nodes.UserNode
at org.neo4j.ogm.context.GraphEntityMapper.mapEntities(GraphEntityMapper.java:206)
at org.neo4j.ogm.context.GraphEntityMapper.map(GraphEntityMapper.java:135)
at org.neo4j.ogm.context.GraphEntityMapper.map(GraphEntityMapper.java:89)
at org.neo4j.ogm.session.delegates.LoadOneDelegate.load(LoadOneDelegate.java:70)
at org.neo4j.ogm.session.delegates.LoadOneDelegate.load(LoadOneDelegate.java:46)
at org.neo4j.ogm.session.Neo4jSession.load(Neo4jSession.java:155)
at controllers.UsersController.getUserMetrics(UsersController.java:372)
at controllers.UsersController.index(UsersController.java:66)
at router.Routes$$anonfun$routes$1$$anonfun$applyOrElse$2$$anonfun$apply$2.apply(Routes.scala:891)
at router.Routes$$anonfun$routes$1$$anonfun$applyOrElse$2$$anonfun$apply$2.apply(Routes.scala:891)
Caused by: org.neo4j.ogm.exception.core.MappingException: Unable to load class with FQN: nodes.UserNode
at org.neo4j.ogm.metadata.reflect.EntityFactory.instantiateObjectFromTaxa(EntityFactory.java:109)
at org.neo4j.ogm.metadata.reflect.EntityFactory.newObject(EntityFactory.java:58)
at org.neo4j.ogm.context.GraphEntityMapper.mapNodes(GraphEntityMapper.java:217)
at org.neo4j.ogm.context.GraphEntityMapper.mapEntities(GraphEntityMapper.java:203)
at org.neo4j.ogm.context.GraphEntityMapper.map(GraphEntityMapper.java:135)
at org.neo4j.ogm.context.GraphEntityMapper.map(GraphEntityMapper.java:89)
at org.neo4j.ogm.session.delegates.LoadOneDelegate.load(LoadOneDelegate.java:70)
at org.neo4j.ogm.session.delegates.LoadOneDelegate.load(LoadOneDelegate.java:46)
at org.neo4j.ogm.session.Neo4jSession.load(Neo4jSession.java:155)
at controllers.UsersController.getUserMetrics(UsersController.java:372)
Caused by: java.lang.ClassNotFoundException: nodes.UserNode
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.neo4j.ogm.metadata.reflect.EntityFactory.instantiateObjectFromTaxa(EntityFactory.java:106)
at org.neo4j.ogm.metadata.reflect.EntityFactory.newObject(EntityFactory.java:58)
at org.neo4j.ogm.context.GraphEntityMapper.mapNodes(GraphEntityMapper.java:217)
at org.neo4j.ogm.context.GraphEntityMapper.mapEntities(GraphEntityMapper.java:203)
at org.neo4j.ogm.context.GraphEntityMapper.map(GraphEntityMapper.java:135)
And the neo4j debug log looks like this:
[info] o.n.o.d.b.r.BoltRequest - Request: MATCH (n:`UserNode`) WHERE ID(n) = { id } WITH n RETURN n,[ [ (n)<-[r_p1:`PEER`]-(u1:`UserNode`) | [ r_p1, u1 ] ] ] with params {id=1}
[debug] o.n.o.d.b.d.BoltDriver - No current transaction, starting a new one
[debug] o.n.o.d.b.d.BoltDriver - Native transaction: org.neo4j.driver.internal.ExplicitTransaction@6acdd993
[debug] o.n.o.d.b.t.BoltTransaction - Committing native transaction: org.neo4j.driver.internal.ExplicitTransaction@6acdd993
[debug] o.n.o.t.Transaction - Thread 62: Commit transaction extent: 0
[debug] o.n.o.t.Transaction - Thread 62: Committed
[debug] o.n.o.t.Transaction - Thread 62: Close transaction extent: 0
[debug] o.n.o.t.Transaction - Thread 62: Closing transaction
[debug] o.n.o.m.MetaData - looking for concrete class to resolve label: UserNode
[debug] o.n.o.m.MetaData - concrete class found: org.neo4j.ogm.metadata.ClassInfo@7abf416c. comparing with what's already been found previously...
[debug] o.n.o.m.MetaData - UserNode resolving class: org.neo4j.ogm.metadata.ClassInfo@7abf416c
[error] application -
I am using
The suggested ClassLoader issue was effectivly the problem. However neo4j-ogm has a way to resolve it by itself. As suggested here it is possible for neo4j-ogm to nor rely on a class loader when loading the types. The code has been fixed and this should be ok on the next version of the ogm (current version with the problem is 3.0.1).