0

GoogleAppEngineを介して単純なRESTAPIを作成しています。私はTaskProjectオブジェクトを持っています。AProjectは1つ以上を持つことができますTask。これらのデータオブジェクトの詳細は次のとおりです。

@Entity
public class Project implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key id;
    private String title;
    private String description;
    private Date createdAt;

    // Section 1
    // @OneToMany(mappedBy = "project")
    // private List<Task> tasks;

    // ...
}

@Entity
public class Task implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Key id;
    private String shortDescription;
    private String longDescription;
    private Date createdAt;
    private Date dueDate;
    private boolean completed;

    // Section 2
    // @ManyToOne
    // @JoinColumn(name = "id_project")
    // private Project project;

    // ...
}

上記のクラスを実装した方法は正常に機能します(セクション1とセクション2はコメント化されています)。ただし、私がやりたいのは、Taskオブジェクトをに関連付けることProjectです。上記のコメントを削除してセクション1とセクション2をアクティブにすると、以下のエラーが発生します。

プロジェクト操作でエラーが表示されます

HTTP ERROR 500

Problem accessing /api/project. Reason:

    Could not initialize class com.aspect.todo.dao.EMFService
Caused by:

java.lang.NoClassDefFoundError: Could not initialize class com.aspect.todo.dao.EMFService
    at com.aspect.todo.dao.Dao.getProjects(Dao.java:144)
    at com.aspect.todo.server.ProjectService.get(ProjectService.java:23)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    ...

タスク操作でエラーが表示される

HTTP ERROR 500

Problem accessing /api/task. Reason:

    INTERNAL_SERVER_ERROR
Caused by:

java.lang.ExceptionInInitializerError
    at com.aspect.todo.dao.Dao.getTasks(Dao.java:98)
    at com.aspect.todo.server.TaskService.get(TaskService.java:24)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    ...


Caused by:

javax.persistence.PersistenceException: Provider error. Provider: org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider
    at javax.persistence.Persistence.createFactory(Persistence.java:176)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:112)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:66
    ...


Caused by:

Errors were encountered when initialising the specified MetaData. See the nested exceptions for details
org.datanucleus.exceptions.NucleusUserException: Errors were encountered when initialising the specified MetaData. See the nested exceptions for details
    at org.datanucleus.metadata.MetaDataManager.initialiseFileMetaDataForUse(MetaDataManager.java:892)
    at org.datanucleus.metadata.MetaDataManager.loadPersistenceUnit(MetaDataManager.java:794)
    at org.datanucleus.jpa.EntityManagerFactoryImpl.initialisePMF(EntityManagerFactoryImpl.java:488)
    ...

Caused by:

Found Meta-Data for class com.aspect.todo.model.Task but this class is not enhanced!! Please enhance the class before running DataNucleus.
org.datanucleus.exceptions.NucleusUserException: Found Meta-Data for class com.aspect.todo.model.Task but this class is not enhanced!! Please enhance the class before running DataNucleus.
    at org.datanucleus.metadata.MetaDataManager.initialiseClassMetaData(MetaDataManager.java:2225)
    at org.datanucleus.metadata.MetaDataManager.initialiseFileMetaData(MetaDataManager.java:2176)
    at org.datanucleus.metadata.MetaDataManager.initialiseFileMetaDataForUse(MetaDataManager.java:881)
    ...

奇妙なことに、これらのセクションをコメントアウトし、コンパイルして実行し、セクション2のみをアクティブにして再実行すると、正常に機能します。Eclipseを閉じて再度開くと、エラーが再度発生します。

注:Datanucleus JDO / JPAバージョン:v1

4

4 に答える 4

0
Found Meta-Data for class com.aspect.todo.model.Task but this class is not enhanced!!
Please enhance the class before running DataNucleus.

実際のところ、クラスは実行時に拡張されないため、実行前に、ご使用の環境で機能するクラスを拡張する方法を見つける必要があります... Maven、Ant、コマンドライン、DataNucleus Eclipseプラグイン、またはGAEEclipseプラグイン。

于 2012-12-01T14:31:05.793 に答える
0

ANTを使用している場合は、</project>タグを閉じる前に、build.xmlに以下の行を追加してください

<target name="datanucleusenhance" depends="compile"
  description="Performs JDO enhancement on compiled data classes.">
<enhance_war war="war" />

そして、アリを構築するときに次のコマンドを与えます " ant datanucleusenhance runserver"

これがお役に立てば幸いです。解決策を見つけるのに少し時間がかかりました。

于 2013-07-17T18:11:38.763 に答える
0

GAE SDKをアップグレードするだけで、問題は解決しました。

于 2013-10-18T19:43:16.160 に答える
0

クラスcom.aspect.todo.model.Taskのメタデータが見つかりましたが、このクラスは拡張されていません!! DataNucleusを実行する前に、クラスを拡張してください。

ここでは、Gradle環境でクラスを強化する方法を紹介します。次の構成を使用します。

  • 依存関係:

    dependencies {
        appengineSdk 'com.google.appengine:appengine-java-sdk:<version>'
        compile 'org.datanucleus:datanucleus-enhancer:<version>'
        compile 'org.datanucleus:datanucleus-api-jpa:<version>'  // or datanucleus-api-jdo
        /* other dependencies */
    }
    
  • プラグイン:
    (gradle-appengine-pluginバージョン1.9.5以降の場合)

    appengine {
        enhancer {
            version = "v2"
            api = "jpa"  // or "jdo"
            enhanceOnBuild = true
        }
        /*...*/
    }
    

    (古いバージョンのgradle-appengine-pluginの場合)

    appengine {
        enhancerVersion = "v2"
    }
    

    build.gradleファイルにwarを作成する前に、enhanceを自動的に実行するには:

    war.dependsOn appengineEnhance
    

タスクの実行に問題がある場合は、(スタックトレースを表示するために)または(エラーログファイルの場所を見つけるために)オプションを使用してタスク:appengineEnhanceを実行してみてください。--stacktrace--info

于 2015-04-03T13:28:03.783 に答える