2016-06-07 87 views
0

從Java EE連接到neo4j服務器時出現問題。Neo4j服務器在Weblogic上使用Java Bolt neo4j-ogm

我用:
- Neo4j的3.0.1在本地主機上
服務器模式 - 的Weblogic 12.1.3
- JEE 7
- 的Neo4j-OGM核心2.0.3
- 的Neo4j-OGM螺栓驅動器2.0.3

我的Maven依賴:

<dependency> 
    <groupId>org.neo4j</groupId> 
    <artifactId>neo4j-ogm-core</artifactId> 
    <version>2.0.3</version> 
</dependency> 
<dependency> 
    <groupId>org.neo4j</groupId> 
    <artifactId>neo4j-ogm-bolt-driver</artifactId> 
    <version>2.0.3</version> 
</dependency> 

我的資源ogm.properties/META-INF:

#Driver, required 
driver=org.neo4j.ogm.drivers.bolt.driver.BoltDriver 

#URI of the Neo4j database, required. If no port is specified, the default port 7687 is used. Otherwise, a port can be specified with bolt://neo4j:[email protected]:1234 
URI=bolt://neo4j:[email protected] 

#Connection pool size (the maximum number of sessions per URL), optional, defaults to 50 
connection.pool.size=150 

#Encryption level (TLS), optional, defaults to REQUIRED. Valid values are NONE,REQUIRED 
encryption.level=NONE 

#Trust strategy, optional, not used if not specified. Valid values are TRUST_ON_FIRST_USE,TRUST_SIGNED_CERTIFICATES 
trust.strategy=TRUST_ON_FIRST_USE 

我使用EJB辛格爾頓定義會話工廠:

@Singleton 
public class Neo4jSessionFactory { 

    private SessionFactory sessionFactory; 

    @PostConstruct 
    public void init() { 
     sessionFactory = new SessionFactory("com.toto.poc.ejb.data.access"); 
    } 

    /** 
    * Get neo4j session 
    * @return the session 
    */ 
    public Session getNeo4jSession() { 
     return sessionFactory.openSession(); 
    } 
} 

它是在「COM .toto.poc.ejb.data.access「包。

我有一個EJB中要定義的業務方法調用:

@Stateless 
public class TopologyBusiness { 

    private @EJB Neo4jSessionFactory neo4jSessionFactory; 

    public Iterable<Map<String, Object>> getApplication(String irt) { 
     String query = "MATCH (a:Application) WHERE a.irt = '" + irt + "' RETURN a"; 

     Session session = neo4jSessionFactory.getNeo4jSession(); 

     return session.query(query, Collections.emptyMap()); 
    } 
} 

但是,當我的客戶呼叫TopologyBusiness,Neo4jSessionFactory的Init(PostConstruct)方法被調用,並且發生一個錯誤:

com.oracle.pitchfork.interfaces.LifecycleCallbackException: Failure to invoke public void com.toto.poc.ejb.data.access.Neo4jSessionFactory.init() on bean class class com.toto.poc.ejb.data.access.Neo4jSessionFactory_wi88u8_Impl with args: null 
    at com.oracle.pitchfork.inject.Jsr250Metadata.invokeLifecycleMethod(Jsr250Metadata.java:379) 
    at com.oracle.pitchfork.inject.Jsr250Metadata.invokeLifecycleMethods(Jsr250Metadata.java:352) 
    at com.oracle.pitchfork.intercept.InterceptionMetadata.invokeLifecycleMethods(InterceptionMetadata.java:399) 
    at weblogic.ejb.container.injection.EjbComponentCreatorImpl.invokePostConstruct(EjbComponentCreatorImpl.java:55) 
    at weblogic.ejb.container.manager.SingletonSessionManager.constructAndInitBean(SingletonSessionManager.java:330) 
    Truncated. see log file for complete stacktrace 
Caused By: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.oracle.pitchfork.inject.Jsr250Metadata.invokeLifecycleMethod(Jsr250Metadata.java:377) 
    Truncated. see log file for complete stacktrace 
Caused By: java.lang.RuntimeException: org.neo4j.ogm.exception.ServiceNotFoundException: Resource: zip:C:/oracle/wls/12.1.3/user_projects/domains/CMDB/servers/LocalServer/tmp/_WL_user/poc-cdb-ear_ear/a8qjfi/poc-cdb-ejb-1.0-SNAPSHOT.jar!/com/toto.poc/ejb/data/access 
    at org.neo4j.ogm.ClassUtils.getUniqueClasspathElements(ClassUtils.java:178) 
    at org.neo4j.ogm.scanner.ClassPathScanner.getUniqueClasspathElements(ClassPathScanner.java:158) 
    at org.neo4j.ogm.scanner.ClassPathScanner.scan(ClassPathScanner.java:130) 
    at org.neo4j.ogm.metadata.DomainInfo.load(DomainInfo.java:316) 
    at org.neo4j.ogm.metadata.DomainInfo.<init>(DomainInfo.java:67) 
    Truncated. see log file for complete stacktrace 
Caused By: org.neo4j.ogm.exception.ServiceNotFoundException: Resource: zip:C:/oracle/wls/12.1.3/user_projects/domains/CMDB/servers/LocalServer/tmp/_WL_user/poc-cdb-ear_ear/a8qjfi/poc-cdb-ejb-1.0-SNAPSHOT.jar!/com/toto.poc/ejb/data/access 
    at org.neo4j.ogm.service.ResourceService.resolve(ResourceService.java:53) 
    at org.neo4j.ogm.ClassUtils.getUniqueClasspathElements(ClassUtils.java:175) 
    at org.neo4j.ogm.scanner.ClassPathScanner.getUniqueClasspathElements(ClassPathScanner.java:158) 
    at org.neo4j.ogm.scanner.ClassPathScanner.scan(ClassPathScanner.java:130) 
    at org.neo4j.ogm.metadata.DomainInfo.load(DomainInfo.java:316) 
    Truncated. see log file for complete stacktrace 

根本原因似乎是:

Caused By: org.neo4j.ogm.exception.ServiceNotFoundException: Resource: zip:C:/oracle/wls/12.1.3/user_projects/domains/CMDB/servers/LocalServer/tmp/_WL_user/poc-cdb-ear_ear/a8qjfi/poc-cdb-ejb-1.0-SNAPSHOT.jar!/com/toto.poc/ejb/data/access 

我不知道爲什麼要在類路徑中查看一個zip文件...
感謝您的幫助!

回答

1

我終於可以解決我的問題了,我瀏覽了一些奇怪的論壇,發現有人在JBoss上有類似的問題。
所以我設法將此解決方案轉換爲Weblogic。

首先,您需要創建自己的資源解析器以提供處理「zip」的方式。
覆蓋ResourceResolver並實現類似下面的方法解決:

public class Neo4jResourceResolver implements ResourceResolver { 

    @Override 
    public File resolve(URL resource) throws Exception { 

     switch (resource.getProtocol()) { 
      case "file": 
       return new File(resource.toURI()); 
      case "jar": 
      case "zip": 
       String jarPath = resource.getPath().substring(0, resource.getPath().indexOf("!")); 
       return new File(jarPath); 
      default: 
       return null; 
     } 
    } 
} 

然後創建一個名爲路徑 「org.neo4j.ogm.classloader.ResourceResolver」「文件的src /主/資源/ META-INF /服務「。
該文件只包含一行,路徑到您的自定義ResourceResolver類:

com.toto.poc.core.access.ucmdb.Neo4jResourceResolver 

而且它的魔力,它的工作原理!

Neo4j現在將探索jar存檔,找到您的NodeEntities並將其映射到您的圖:)