0

我正在尝试使用 neo4j 作为 Apache Isis 的后备存储,但看起来可能需要一些开发。如果我添加 datanucleus-neo4j 依赖项,neo4j JDO 连接似乎正在初始化,但 Apache Isis 期待不同类型的 StoreManager。

这是我得到的例外

org.datanucleus.store.neo4j.Neo4jStoreManager 无法转换为 org.datanucleus.store.schema.SchemaAwareStoreManager

如何在 Apache Isis 中使用 neo4j 作为后备存储?
我在 Isis 中阅读了有关 nosql 支持的信息,但它不是当前版本的一部分吗? http://isis.apache.org/components/objectstores/nosql/about.html

谢谢!

在persistor.properties -

#
# neo4j
#
isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=neo4j:testDB
isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=sa
isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=

堆栈跟踪的相关部分 -

Caused by: java.lang.ClassCastException: org.datanucleus.store.neo4j.Neo4jStoreManager cannot be cast to org.datanucleus.store.schema.SchemaAwareStoreManager
at org.apache.isis.objectstore.jdo.datanucleus.DataNucleusApplicationComponents.createSchema(DataNucleusApplicationComponents.java:125)
at org.apache.isis.objectstore.jdo.datanucleus.DataNucleusApplicationComponents.init(DataNucleusApplicationComponents.java:111)
at org.apache.isis.objectstore.jdo.datanucleus.DataNucleusApplicationComponents.<init>(DataNucleusApplicationComponents.java:97)
at org.apache.isis.objectstore.jdo.datanucleus.DataNucleusPersistenceMechanismInstaller.createDataNucleusApplicationComponentsIfRequired(DataNucleusPersistenceMechanismInstaller.java:112)
at org.apache.isis.objectstore.jdo.datanucleus.DataNucleusPersistenceMechanismInstaller.createObjectStore(DataNucleusPersistenceMechanismInstaller.java:89)
at org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory.createPersistenceSession(PersistenceSessionFactory.java:94)
at org.apache.isis.core.runtime.system.session.IsisSessionFactoryDefault.openSession(IsisSessionFactoryDefault.java:217)
at org.apache.isis.core.runtime.system.context.IsisContextThreadLocal.openSessionInstance(IsisContextThreadLocal.java:149)
at org.apache.isis.core.runtime.system.context.IsisContext.openSession(IsisContext.java:271)
at org.apache.isis.core.runtime.system.IsisSystemFixturesHookAbstract.initializeServices(IsisSystemFixturesHookAbstract.java:154)
at org.apache.isis.core.runtime.system.IsisSystemFixturesHookAbstract.init(IsisSystemFixturesHookAbstract.java:122)
at org.apache.isis.core.runtime.runner.IsisInjectModule.provideIsisSystem(IsisInjectModule.java:133)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.google.inject.internal.ProviderMethod.get(ProviderMethod.java:104)
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031)
at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
at com.google.inject.Scopes$1$1.get(Scopes.java:65)
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
at com.google.inject.internal.SingleFieldInjector.inject(SingleFieldInjector.java:53)
at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:110)
at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:75)
at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:73)
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1024)
at com.google.inject.internal.MembersInjectorImpl.injectAndNotify(MembersInjectorImpl.java:73)
at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:60)
... 48 more
4

2 回答 2

3

我不确定这意味着什么,但我能够通过org.apache.isis.objectstore.jdo.datanucleus.DataNucleusApplicationComponents#createSchema在“Isis 核心运行时模块”中进行修改以在转换前检查 datanucleus StoreManager 是否支持 SchemaAwareStoreManager 接口,从而获得与 Apache Isis 一起使用的 neo4j 数据存储。

它正在成功持久化数据。
似乎太容易成为合法的增强功​​能,但我将始终由贡献者运行它。

private void createSchema(final Map<String, String> props, final Set<String> classesToBePersisted) {
    final JDOPersistenceManagerFactory jdopmf = (JDOPersistenceManagerFactory)persistenceManagerFactory;
    final NucleusContext nucleusContext = jdopmf.getNucleusContext();
    final StoreManager storeManager = nucleusContext.getStoreManager();
    if (storeManager instanceof SchemaAwareStoreManager) {
        ((SchemaAwareStoreManager)storeManager).createSchema(classesToBePersisted, asProperties(props));
    }
}
于 2014-12-21T01:06:01.960 回答
1

查看 Apache Isis 邮件列表、原始查询后续票证

于 2014-12-22T08:11:48.680 回答