0

我正在通过 Google 应用引擎创建一个简单的 REST API。我有TaskProject对象。AProject可以有一个或多个Tasks。以下是有关这些数据对象的一些详细信息:

@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

如果您使用的是 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
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 插件或 GAE Eclipse 插件。

于 2012-12-01T14:31:05.793 回答
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.dependsOn appengineEnhance
    

如果您在执行任务时遇到问题:appengineEnhance,请尝试使用--stacktrace(查看堆栈跟踪)或--info(查找错误日志文件的位置)选项运行它。

于 2015-04-03T13:28:03.783 回答
0

只需升级您的 GAE SDK,它就为我解决了问题。

于 2013-10-18T19:43:16.160 回答