【问题标题】:Joda DateTime not supported property type in Google App EngineGoogle App Engine 中不支持 Joda DateTime 的属性类型
【发布时间】:2013-11-14 14:33:02
【问题描述】:

您好,我刚开始使用 Google App Engine,这个错误超出了我的范围。

尝试将 Joda DataTime 与 Google App Engine 结合使用。我有一个拥有 dateTime 的实体,当它到达 em.close(); 时出现错误错误显示“sentTime:org.joda.time.DateTime 不是受支持的属性类型。”

        EntityManagerFactory emf = EMF.get();
        EntityManager em = null;
        try {
            em = emf.createEntityManager();
                     List<Tasks> schedule = patients2.getTasks();
                     Tasks tasks = new Tasks();
                     String date = req.getParameter("dateTime")+":00.000-00:00";   DateTime sentTime = new DateTime (date);
                     tasks.setSentTime(sentTime);
                     schedule.add(tasks);
                     patients2.setTasks(schedule);
                     em.persist(patients2);
            }

        }
        }finally {
            if (em != null)
                em.close();
        }

堆栈跟踪是

WARNING: /CreateSchedule
java.lang.IllegalArgumentException: sentTime: org.joda.time.DateTime is not a supported property type.
    at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedSingleValue(DataTypeUtils.java:235)
    at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedValue(DataTypeUtils.java:207)
    at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedValue(DataTypeUtils.java:173)
    at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedValue(DataTypeUtils.java:148)
    at com.google.appengine.api.datastore.PropertyContainer.setProperty(PropertyContainer.java:101)
    at com.google.appengine.datanucleus.EntityUtils.setEntityProperty(EntityUtils.java:174)
    at com.google.appengine.datanucleus.StoreFieldManager.storeFieldInEntity(StoreFieldManager.java:360)
    at com.google.appengine.datanucleus.StoreFieldManager.storeObjectField(StoreFieldManager.java:190)
    at org.datanucleus.state.AbstractStateManager.providedObjectField(AbstractStateManager.java:1447)
    at healith.Tasks.jdoProvideField(Tasks.java)
    at healith.Tasks.jdoProvideFields(Tasks.java)
    at org.datanucleus.state.AbstractStateManager.provideFields(AbstractStateManager.java:1515)
    at com.google.appengine.datanucleus.DatastorePersistenceHandler.insertObjectsInternal(DatastorePersistenceHandler.java:241)
    at com.google.appengine.datanucleus.DatastorePersistenceHandler.insertObject(DatastorePersistenceHandler.java:218)
    at org.datanucleus.state.JDOStateManager.internalMakePersistent(JDOStateManager.java:2381)
    at org.datanucleus.state.JDOStateManager.flush(JDOStateManager.java:3778)

...

【问题讨论】:

    标签: java google-app-engine jpa jodatime


    【解决方案1】:

    我在我的项目中使用 Objectify,并且有一种方法允许 Joda DateTime 作为实体属性。

    import com.googlecode.objectify.impl.translate.opt.joda.JodaTimeTranslators;
    
    // immediately before your entity registrations
    JodaTimeTranslators.add(factory());
    

    【讨论】:

    • 我确认这行得通。 JodaTimeTranslators.add(ObjectifyService.factory())
    【解决方案2】:

    如果您查看错误,您会发现在将实体存储到数据库时,它会抱怨 Joda 的 DateTime 不是受支持的属性类型之一。

    在 GAE 上使用 JPA,supported property types 是:basic DB types 之一、这些基本类型的 Collection 或其他实体。

    【讨论】:

    • 正确,直到他们在类路径中放置一个插件,当然可以将这些类型转换为“支持的类型”之一。
    • 对不起 dataNucleus newb 你能告诉我具体如何安装/合并 dataNucleus 插件。我已经下载了 dataNuclues eclipse 插件并尝试从链接安装 jars,但似乎使用 GAE 引擎你需要做一些超越。我是否需要进入特定的 plugin.xml 文件并手动执行某些操作,还是比这简单得多?帮助总是很感激
    • @Frido1,不知道 DN Eclipse 插件与这里有什么关系;你问如何持久化 Jodatime 类型,所以我说把 datanucleus-jodatime 插件放在你的 CLASSPATH 中。
    • 通过插件我在考虑插件需要安装的东西。感谢您的帮助!
    【解决方案3】:

    DataNucleus 项目(由 GAE JDO/JPA 使用)有一个用于持久化此类类型的插件。也许你可以把它放在 CLASSPATH 中。 http://www.datanucleus.org/plugins/store.types.jodatime.html

    可从Maven central 下载。为您使用的 GAE 版本选择最合适的版本。把它放在 CLASSPATH 中就是你所做的一切。如果您有问题,请查看 LOG,因为它会说明该插件是否在运行时注册。

    【讨论】:

    • 这可以通过仅在 pom.xml 中包含 datanucleus mvn 依赖项来工作吗?我看不出将它放在 Windows 的类路径上会如何帮助它在 GAE 上运行。
    • 另外,如果数据核最终只是在 java.util.Date 和 JodaTime 的 DateTime 之间转换,我猜时区会丢失,这是我想使用 JodaTime 的原因之一。是吗?
    猜你喜欢
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多