将JPA与Google Cloud SQL一起使用会导致java.lang.NoClassDefFoundError:java.io.FileWriter是一个受限制的类

时间:2013-02-15 14:40:02

标签: google-app-engine jpa

我在使用Google Cloud SQL上的JPA时遇到问题。我得到了一个java.lang.NoClassDefFoundError:java.io.FileWriter,这是Google App Engine确实不支持的类。

我仔细按照https://developers.google.com/eclipse/docs/cloudsql-jpatools上的说明使用EclipseLink 2.4.1 - Juno(我在Linux Mint 14上运行Eclipse Juno)

我也尝试过使用EclipseLink 2.3.3 - Indigo,但效果相同。

我知道Google Cloud SQL数据库正在运行,因为我尝试使用JDBC访问:https://developers.google.com/appengine/docs/java/cloud-sql/developers-guide 并且按预期工作。

调用JPA的第一个方法是:

public static void createBookJPA(BookJPA c) 
{
  logger.info("Entering createBookJPA: [" + c.getIsbn() + "," + c.getBookName() + "]");
  EntityManager mgr = EMF.get().createEntityManager();
  try 
  {
    logger.info("before begin");
    mgr.getTransaction().begin();
    logger.info("before persist");
    mgr.persist(c);
    logger.info("before commit");
    mgr.getTransaction().commit();
    logger.info("after commit");
  }
  finally 
  {
    mgr.close();
  }
  logger.info("Exiting createBookJPA");
}

在日志中给出了这个:

feb 15, 2013 2:29:25 PM dk.lundogbendsen.schoubo.gae.ex5demo.BookService createBookJPA
INFO: Entering createBookJPA: [JPA:978-1-849690-44-7,Google App Engine Java and GWT Application Development]

[EL Info]: 2013-02-15 14:29:25.79--ServerSession(619728523)--EclipseLink, version: Eclipse Persistence Services - 2.4.1.v20121003-ad44345
[EL Info]: connection: 2013-02-15 14:29:29.088--ServerSession(619728523)--file:/home/jschoubo/Interests/Softfact/Develop/GAE/eclipseworkspaceGAE/lobGAE/war/WEB-INF/classes/_transactions-optional login successful
[EL Severe]: ejb: 2013-02-15 14:29:30.333--ServerSession(619728523)--java.lang.NoClassDefFoundError: java.io.FileWriter is a restricted class. Please see the Google  App Engine developer's guide for more details.

feb 15, 2013 2:29:30 PM dk.lundogbendsen.schoubo.gae.ex5demo.LobGAEEx5DemoSQLJPA createAuthor
WARNING: java.lang.NoClassDefFoundError: java.io.FileWriter is a restricted class. Please see the Google  App Engine developer's guide for more details.

我在Jetty上以开发者模式在本地运行代码,但我使用的是远程Cloud SQL库,因为我没有安装本地MySQL。

此链接JPA with Google Cloud SQL "NoClassDefFoundError: java.util.prefs.Preferences is a restricted class"似乎谈论了类似的问题,但我已经检查过我的persistence.xml包含com.google.appengine.api.rdbms.AppEngineDriver,因此该解决方案无法解决我的问题。

非常感谢任何帮助!

[编辑] 进一步的观察:

  • 包含EclipseLink会阻止JDO访问HRD - 当我尝试时,我在javax.jdo.JDOHelper上出现类加载器错误
  • 删除WEB-INF / lib中的JPA facet和eclipselink jar使得NoClassDefFoundError消失并使代码完成所有步骤(begin,persist,commit)。但是,现在记录是否在本地写入dev.mode HRD数据存储区(local_db.bin)?那么问题可能是我如何让DataNucleus JPA使用Cloud SQL?

某处(我找不到参考资料)我偶然发现EclipseLink完全是多余的,因为JPA对Google Cloud SQL(以及HRD)的支持已经在DataNucleus包中。有人能证实吗?

0 个答案:

没有答案