2017-09-27 123 views
1

自從2周成功使用Neo4J OGM + Play Framework以來,現在它不再工作了。每當我在代碼中改變某些東西時,無論是在NodeEntity類還是其他類中,當我嘗試使用org.neo4j.ogm中的find方法從數據庫中獲取某些東西時,它會導致java.lang.ClassNotFoundException。 session.Session。只有當我清除數據庫並重新填充它時,我才能插入並獲取我的NodesEntities。java.lang.ClassNotFoundException每次我在代碼中改變某些東西(Neo4j OGM + Play!)

Java版本:1.8
斯卡拉版本:2.11.7
SBT版本:2.6.3

build.sbt

libraryDependencies += "org.neo4j" % "neo4j-ogm-core" % "3.0.0-RC1" 
libraryDependencies += "org.neo4j" % "neo4j-ogm-bolt-driver" % "3.0.0-RC1" 

Neo4JSessionFactory.java

public class Neo4jSessionFactory { 

    private Config config; 

    @Inject 
    private Neo4jSessionFactory(Config config) { 
     this.config = config; 
    } 


    public Session getNeo4jSession() { 
     String uri = config.getString("ogm.db.uri"); 
     String username = config.getString("ogm.db.username"); 
     String password = config.getString("ogm.db.password"); 
     List<String> modelList = config.getStringList("ogm.db.models"); 

     String[] models = modelList.toArray(new String[modelList.size()]); 

     Configuration configuration = new Configuration.Builder() 
       .uri(uri) 
       .credentials(username, password) 
       .build(); 
     return new SessionFactory(configuration, models).openSession(); 
    } 
} 

application.conf

ogm{ 
    db{ 
    uri = "bolt://XXX.de:7687" 
    username = "XXX" 
    password = "XXX" 
    models = ["neo4j.nodes", "neo4j.relationships", "neo4j.entities"] 
    } 
} 

UserNode.java

@NodeEntity(label = "UserNode") 
public class UserNode extends AbstractNode { 

    @JsonProperty("username") 
    private String username; 

    @JsonProperty("firstname") 
    private String firstname; 

    @JsonProperty("lastname") 
    private String lastname; 

    @JsonProperty("email") 
    private String email; 

    @JsonProperty("password") 
    private String password; 

    @JsonProperty("picture") 
    private String picture; 

    @Relationship(type = Friendship.TYPE) 
    @JsonProperty("friendships") 
    private Set<Friendship> friendships = new HashSet<>(); 

    @Relationship(type = Posted.TYPE) 
    @JsonProperty("postings") 
    private Set<Posted> postings = new HashSet<>(); 

    @Relationship(type = Pinned.TYPE, direction = Relationship.INCOMING) 
    @JsonProperty("pinnings") 
    private Set<Pinned> pinnings = new HashSet<>(); 


    public UserNode() { 
    } 
} 

UserService.java

public class UserService extends AbstractService<UserNode> { 

    @Inject 
    public UserService(Neo4jSessionFactory neo4jSessionFactory) { 
     super(neo4jSessionFactory); 
    } 

    @Override 
    public Class<UserNode> getEntityType() { 
     return UserNode.class; 
    } 
} 

AbstractService.java

public abstract class AbstractService<T extends AbstractNode> { 

    private static final int DEPTH_LIST = 1; 
    private static final int DEPTH_ENTITY = 1; 

    protected Session session; 

    @Inject 
    public AbstractService(Neo4jSessionFactory neo4jSessionFactory) { 
     this.session = neo4jSessionFactory.getNeo4jSession(); 
    } 


    public Collection<T> findAll() { 
     return session.loadAll(getEntityType(), DEPTH_LIST); <-- (AbstractService:27) 
    } 

    public Optional<T> find(Long id) { 
     return Optional.ofNullable(session.load(getEntityType(), id, DEPTH_ENTITY)); 
    } 

    public void delete(Long id) { 
     session.delete(session.load(getEntityType(), id)); 
    } 

    public Optional<T> createOrUpdate(T entity){ 
     T updated = find(entity.getId()) 
       .map(existing -> { 
        entity.setCreated(existing.getCreated()); 
        return entity; 
       }).orElse(entity); 

     session.save(updated, DEPTH_ENTITY); 
     return find(updated.getId()); 
    } 
} 

AbstactController.java

public Result all(){ 
    return toJsonResult(service.findAll()); <-- (AbstractCRUDController.java:19) 
} 

異常

play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[MappingException: Error mapping GraphModel to instance of neo4j.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:344) 
at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:343) 
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.MappingException: Error mapping GraphModel to instance of neo4j.nodes.UserNode 
at org.neo4j.ogm.context.GraphEntityMapper.mapEntities(GraphEntityMapper.java:168) 
at org.neo4j.ogm.context.GraphEntityMapper.map(GraphEntityMapper.java:124) 
at org.neo4j.ogm.context.GraphEntityMapper.map(GraphEntityMapper.java:89) 
at org.neo4j.ogm.session.delegates.LoadByTypeDelegate.loadAll(LoadByTypeDelegate.java:65) 
at org.neo4j.ogm.session.delegates.LoadByTypeDelegate.loadAll(LoadByTypeDelegate.java:99) 
at org.neo4j.ogm.session.Neo4jSession.loadAll(Neo4jSession.java:167) 
at neo4j.services.AbstractService.findAll(AbstractService.java:27) 
at controllers.AbstractCRUDController.all(AbstractCRUDController.java:19) 
at router.Routes$$anonfun$routes$1$$anonfun$applyOrElse$2$$anonfun$apply$2.apply(Routes.scala:364) 
at router.Routes$$anonfun$routes$1$$anonfun$applyOrElse$2$$anonfun$apply$2.apply(Routes.scala:364) 
Caused by: org.neo4j.ogm.exception.MappingException: Unable to load class with FQN: neo4j.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:179) 
at org.neo4j.ogm.context.GraphEntityMapper.mapEntities(GraphEntityMapper.java:165) 
at org.neo4j.ogm.context.GraphEntityMapper.map(GraphEntityMapper.java:124) 
at org.neo4j.ogm.context.GraphEntityMapper.map(GraphEntityMapper.java:89) 
at org.neo4j.ogm.session.delegates.LoadByTypeDelegate.loadAll(LoadByTypeDelegate.java:65) 
at org.neo4j.ogm.session.delegates.LoadByTypeDelegate.loadAll(LoadByTypeDelegate.java:99) 
at org.neo4j.ogm.session.Neo4jSession.loadAll(Neo4jSession.java:167) 
at neo4j.services.AbstractService.findAll(AbstractService.java:27) 
Caused by: java.lang.ClassNotFoundException: neo4j.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:179) 
at org.neo4j.ogm.context.GraphEntityMapper.mapEntities(GraphEntityMapper.java:165) 
at org.neo4j.ogm.context.GraphEntityMapper.map(GraphEntityMapper.java:124) 

誰能告訴我,如果我要發瘋,或者如果它仍然被保存?

+0

嘗試激活'org.neo4j.ogm'包中的調試日誌。這應該指向您的解決方案。 作爲一個方面說明:在你的情況下,會話應該是短暫的對象。你應該注入並持有'SessionFactory',而不是會話。然後在你的服務層,當你訪問數據庫時,獲得一個短暫的會話。 – nmervaillie

回答

2

我試過你的代碼,發現這個錯誤只發生在GET請求中。 我用POST請求嘗試插入時發現了這個問題。在這種情況下,「find」 - 方法找到了合適的類,但後續的GET請求沒有。但我不明白爲什麼它不適用於GET請求。也許標題不同於POST請求?放棄獲得,獲取資源也不是永久的解決方案。

+1

供參考:在GitHub上鍊接到此問題https://github.com/neo4j/neo4j-ogm/issues/429 – meistermeier