【问题标题】:The PersistenceManagerFactory class must define a static method?PersistenceManagerFactory 类必须定义静态方法吗?
【发布时间】:2014-08-20 20:53:34
【问题描述】:

我正在尝试将我的 android 应用程序连接到我的后端端点(在 Google 的 App Engine 中),以便我可以将我的 java 对象存储在 Google 的数据存储区中。但是,当我尝试初始化 PersistenceManagerFactory 对象时,我收到了在本文末尾看到的错误 - The PersistenceManagerFactory class must define a static method

我正在尝试使用以下代码初始化对象,并注意:我确实在类路径中有该库。

public static PersistenceManagerFactory InitializePersistanceManagerClass(){
        Properties properties = new Properties();
        properties.setProperty("javax.jdo.PersistenceManagerFactoryClass", "org.datanucleus.api.jdo.JDOPersistenceManagerFactory");
        properties.setProperty("javax.jdo.option.ConnectionURL", "appengine");
        properties.setProperty("javax.jdo.option.NontransactionalRead", "true");
        properties.setProperty("javax.jdo.option.NontransactionalWrite", "true");
        properties.setProperty("javax.jdo.option.RetainValues", "true");
        properties.setProperty("datanucleus.appengine.autoCreateDatastoreTxns", "true");
        properties.setProperty("datanucleus.appengine.singletonPMFForName", "true");
        PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory(properties);
        return pmf;
    }

错误中没有列出行号,但我 90% 确定问题出在上面的代码中,或者我用于 persistenceManagerFactory 的类中。此代码运行时的错误如下所示。有任何想法吗?我真的不明白问题是什么......

   08-23 09:10:31.826    7932-7932/com.myApp.myModule E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.myApp.myModule, PID: 7932
    javax.jdo.JDOFatalInternalException: The PersistenceManagerFactory class must define a static method
    PersistenceManagerFactory getPersistenceManagerFactory(Map props).
    The class "org.datanucleus.jdo.JDOPersistenceManagerFactory"
    defines a non-static getPersistenceManagerFactory(Map props) method.
            at javax.jdo.JDOHelper.invokeGetPersistenceManagerFactoryOnImplementation(Unknown Source)
            at javax.jdo.JDOHelper.getPersistenceManagerFactory(Unknown Source)
            at javax.jdo.JDOHelper.getPersistenceManagerFactory(Unknown Source)
            at com.myApp.myModule.forStorage.PMF.<init>(Unknown Source)
            at com.myApp.myModule.Login.onConnected(Unknown Source)
            at wz.a(Unknown Source)
            at rb.e(Unknown Source)
            at rb.d(Unknown Source)
            at rd.onConnected(Unknown Source)
            at wz.a(Unknown Source)
            at wz.a(Unknown Source)
            at wy.a(Unknown Source)
            at wy.a(Unknown Source)
            at wv.b(Unknown Source)
            at wu.handleMessage(Unknown Source)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:157)
            at android.app.ActivityThread.main(ActivityThread.java:5872)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:852)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:668)
            at dalvik.system.NativeStart.main(Native Method)
    NestedThrowablesStackTrace:
    java.lang.NullPointerException
            at javax.jdo.JDOHelper.forName(Unknown Source)
            at javax.jdo.JDOHelper.invokeGetPersistenceManagerFactoryOnImplementation(Unknown Source)
            at javax.jdo.JDOHelper.getPersistenceManagerFactory(Unknown Source)
            at javax.jdo.JDOHelper.getPersistenceManagerFactory(Unknown Source)
            at com.myApp.myModule.forStorage.PMF.<init>(Unknown Source)
            at com.myApp.myModule.Login.onConnected(Unknown Source)
            at wz.a(Unknown Source)
            at rb.e(Unknown Source)
            at rb.d(Unknown Source)
            at rd.onConnected(Unknown Source)
            at wz.a(Unknown Source)
            at wz.a(Unknown Source)
            at wy.a(Unknown Source)
            at wy.a(Unknown Source)
            at wv.b(Unknown Source)
            at wu.handleMessage(Unknown Source)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:157)
            at android.app.ActivityThread.main(ActivityThread.java:5872)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:852)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:668)
            at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 您似乎在那里使用了一些古老的 JDO 实现 jar。 org.datanucleus.api.jdo.JDOPersistenceManagerFactory 是要使用的类,而不是原始应用引擎的旧文档中提到的东西
  • 谢谢,但我在修改代码后收到同样的错误,我收到的错误是:akm: PersistenceManagerFactory 类必须定义一个静态方法 PersistenceManagerFactory getPersistenceManagerFactory(Map props)。 “org.datanucleus.api.jdo.JDOPersistenceManagerFactory”类定义了一个非静态的getPersistenceManagerFactory(Map props)方法。 ,,,,,,,,,,,还有什么想法吗?
  • 显然该消息是完全错误的,根据github.com/datanucleus/datanucleus-api-jdo/blob/master/src/main/…,所以建议您将注意力转向抛出该异常的软件
  • 嗯。我不知道从哪里开始寻找......过去几天我一直在努力解决这个问题。我应该查看软件的哪个部分?这似乎应该更清楚一点,因为我的意图是使用 appengine 制作一个简单的应用程序......
  • 谁知道“ako.a”是什么?一些安卓垃圾?它抛出异常

标签: java android google-app-engine datanucleus


【解决方案1】:

javax/jdo/Bundle.properties,我们可以看到下面的定义。
EXC_GetPMFNullPointerException = PersistenceManagerFactory 类必须定义一个静态方法PersistenceManagerFactory getPersistenceManagerFactory(Map props)。 “{0}”类定义了一个非静态的getPersistenceManagerFactory(Map props) 方法。

javax.jdo.JDOHelper 源代码中,我们可以推断出以下错误消息“PersistenceManagerFactory 类必须定义一个静态方法PersistenceManagerFactory getPersistenceManagerFactory(Map props)org.datanucleus.jdo.JDOPersistenceManagerFactory 类定义了一个非静态getPersistenceManagerFactory(Map props) 方法。”来自invokeGetPersistenceManagerFactoryOnImplementation 方法中的以下代码。

    catch (NullPointerException e) {
throw new JDOFatalInternalException (msg.msg("EXC_GetPMFNullPointerException", pmfClassName), e);} 

这是由java.lang.NullPointerExceptionjavax.jdo.JDOHelper.forName(Unknown Source) 引起的,这很可能来自Class.forName(name, init, loader);
无论如何,您可以修改 javax.jdo.JDOHelper.forName 方法以添加更多跟踪并在其中打印更多异常信息。这并不难。
如果需要,您告诉我“jdo-api”的版本,然后,我可以为您提供一个。

【讨论】:

  • 您好,感谢您的回复。我正在使用 jdo-api-3.1-rc1.jar、datanucleus-api-jdo-3.1.3.jar、xml-apis-2.0.2.jar。我目前正在调查 JDOHelper 源代码,看看是否可以在错误中添加更多代码...
  • 好的,如果您需要修改后的jar,我可以为您提供。仅供参考。
  • 感谢您的帮助,我已经放弃了自己的实现,从头开始...
  • @user198923 很好。祝你好运!
猜你喜欢
  • 1970-01-01
  • 2018-11-01
  • 2023-03-10
  • 2012-01-01
  • 2012-10-15
相关资源
最近更新 更多