2013-11-04 73 views
3

嗨我剛剛開始使用Google App Engine,但這個錯誤超出了我的視野。Joda DateTime不支持Google App Engine中的媒體資源類型

試圖在Google App Engine中使用Joda DataTime。我有一個實體,它包含一個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) 

...

回答

1

DataNucleus項目(由GAE JDO/JPA使用)有一個用於保存這些類型的插件。也許你可以把它放在CLASSPATH中。 http://www.datanucleus.org/plugins/store.types.jodatime.html

可從Maven central下載。爲您使用的任何版本的GAE選擇最合適的版本。把它放在CLASSPATH中就是你所做的一切。如果你遇到問題,可以看看LOG,因爲它會表明該插件是否在運行時註冊。

+0

可以通過在pom.xml中只包含datanucleus mvn依賴項來工作嗎?我沒有看到如何將它放在Windows的類路徑上來幫助它在GAE上工作。 – Skychan

+0

此外,如果datanucleus最終只是在java.util.Date和JodaTime的DateTime之間轉換,我猜測時區將會丟失,這是我想要使用JodaTime的原因之一。真正? – Skychan

2

如果你看一下錯誤,你會看到,存儲實體到它抱怨說,喬達的DateTime是DB時不是支持的屬性類型之一。

對於GAE上的JPA,supported property types是:這些基本類型的basic DB types,Collection之一或另一個實體。

+1

正確,直到他們把一個插件放到類路徑中,當然這些類型轉換成「受支持的類型」之一。 – DataNucleus

+0

對不起dataNucleus newb在這裏你能告訴我如何安裝/合併dataNucleus插件。我已經下載了dataNuclues eclipse插件,並嘗試從鏈接安裝jar,但似乎用GAE引擎需要做一些超越的事情。我是否需要進入特定的plugin.xml文件並手動執行某些操作,還是比這更簡單?幫助總是讚賞 – Frido1

+0

@ Frido1,不知道DN Eclipse插件與這裏的任何東西有什麼關係;你問如何堅持Jodatime類型,所以我說把datanucleus-jodatime插件放在你的CLASSPATH中。 – DataNucleus

3

我在我的項目中使用Objectify,並有一種方法來允許Joda DateTime作爲實體屬性。

import com.googlecode.objectify.impl.translate.opt.joda.JodaTimeTranslators; 

// immediately before your entity registrations 
JodaTimeTranslators.add(factory()); 
+0

我確認這是有效的。 JodaTimeTranslators.add(ObjectifyService.factory()) – Skychan

相關問題