【问题标题】:Google App Engine Entity Relationship Annotations end up HTTP 500Google App Engine 实体关系注释最终达到 HTTP 500
【发布时间】:2023-03-03 03:16:01
【问题描述】:

我正在通过 Google 应用引擎创建一个简单的 REST API。我有 TaskProject 对象。一个Project 可以有一个或多个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 关联起来。每当我删除上面的 cmets 并激活第 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

【问题讨论】:

    标签: google-app-engine jakarta-ee datanucleus


    【解决方案1】:
    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 插件。

    【讨论】:

    • 在项目属性 > Google > App Engine > ORM 下,我在上面明确列出了我的类(尽管有 /src 文件夹,其中已经包含它们)。还是同样的问题。
    • 所以您使用的是 GAE Eclipse 插件(仅由 Google 支持,请尝试他们的 google 组),正如我所说,还有许多其他选项。尝试其他一种
    【解决方案2】:

    如果您使用的是 ANT,请在您的 build.xml 中添加以下行,然后在 &lt;/project&gt; 标记关闭之前添加

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

    并在构建蚂蚁时给出以下命令“ant datanucleusenhance runserver

    希望这很有用,我花了一段时间才找到解决方案。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        找到 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(查找错误日志文件的位置)选项运行它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多