【发布时间】:2015-03-23 12:02:55
【问题描述】:
我打电话时遇到这个异常
jobInDatabase = pm.getObjectById(DAOJob.class, job.getKey());
导致以下异常
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Double
at com.eurekaapp.server.dao.mappedobjects.DAOJob.jdoReplaceField(DAOJob.java)
at com.eurekaapp.server.dao.mappedobjects.DAOJob.jdoReplaceFields(DAOJob.java)
at org.datanucleus.state.JDOStateManager.replaceFields(JDOStateManager.java:1935)
at org.datanucleus.state.JDOStateManager.replaceFields(JDOStateManager.java:1962)
at com.google.appengine.datanucleus.DatastorePersistenceHandler.fetchObject(DatastorePersistenceHandler.java:567)
at org.datanucleus.state.JDOStateManager.loadFieldsFromDatastore(JDOStateManager.java:1638)
at org.datanucleus.state.JDOStateManager.validate(JDOStateManager.java:3511)
at org.datanucleus.ObjectManagerImpl.findObject(ObjectManagerImpl.java:3379)
at org.datanucleus.api.jdo.JDOPersistenceManager.getObjectById(JDOPersistenceManager.java:1722)
at org.datanucleus.api.jdo.JDOPersistenceManager.getObjectById(JDOPersistenceManager.java:1740)
at com.eurekaapp.server.dao.GoogleCloud.getJob(GoogleCloud.java:712)
at com.eurekaapp.server.service.DAOServiceImpl.getJob(DAOServiceImpl.java:661)
at com.eurekaapp.server.api.client.AddJobEvent.doPost(AddJobEvent.java:55)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:125)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:60)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:254)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:146)
at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:527)
at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:437)
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:444)
at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:220)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:308)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:300)
at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:441)
at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
at java.lang.Thread.run(Thread.java:745)
我不确定哪个字段抛出了这个异常? 我在 obj 中有 3 个双打 - 重量 0 交货经度 0 交付纬度 0
其余的数字都是长整数。目前这只发生在这一个对象上。
如果没有传入任何值,这些值是默认设置的。接下来,如果我将这些默认值设置为代表实际的双精度值,它会纠正这个问题。
以下是导致异常的服务器上的一些日志:
I 12:16:05.092 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,091 DEBUG Request 6CDEEF07 class:doPost:45 - user.isParsingSuccessfull()
I 12:16:05.093 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,092 DEBUG Request 6CDEEF07 class:isReceivedVersionCorrect:1830 - isReceivedVersionCorrect(): starting
I 12:16:05.094 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,093 DEBUG Request 6CDEEF07 class:isReceivedVersionCorrect:1833 - isReceivedVersionCorrect(): try
I 12:16:05.095 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,094 DEBUG Request 6CDEEF07 class:isReceivedVersionCorrect:1837 - isReceivedVersionCorrect(): version correct, version[17]
I 12:16:05.096 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,095 DEBUG Request 6CDEEF07 class:isReceivedVersionCorrect:1846 - isReceivedVersionCorrect(): successfull true
I 12:16:05.097 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,096 DEBUG Request 6CDEEF07 class:doPost:47 - daoService.isReceivedVersionCorrect(passedJSONArray.getJSONObject(0))
I 12:16:05.098 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,097 DEBUG Request 6CDEEF07 class:doPost:49 - passedJSONArray[1]
I 12:16:05.099 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,098 DEBUG Request 6CDEEF07 class:isReceivedJobEventValid:1962 - isReceivedJobEventValid(): starting
I 12:16:05.100 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,099 DEBUG Request 6CDEEF07 class:isReceivedJobEventValid:1965 - isReceivedJobEventValid(): try
I 12:16:05.101 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,100 DEBUG Request 6CDEEF07 class:isReceivedJobEventValid:1989 - DAOJobEvent() jobEvent.setParsingSuccessfull(true); DAOJobEvent [key=null, localID=95, jobID=5351674944159744, eventType=11, eventTime=Sun Mar 22 19:07:08 UTC 2015, latitude=53.325, longitude=-6.32569, notes=This job has been finished automatically by the phone, storedEventTime=Mon Mar 23 12:16:05 UTC 2015, companyID=6037653766012928, userID=6012377212387328, nanoTime=3020586876124620, sequence=null]
I 12:16:05.102 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,101 DEBUG Request 6CDEEF07 class:isReceivedJobEventValid:1996 - DAOJobEvent() returning
I 12:16:05.103 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,102 DEBUG Request 6CDEEF07 class:getJob:706 - getJob(): starting
I 12:16:05.104 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,103 DEBUG Request 6CDEEF07 Cache:debug:58 - Level 1 Cache of type "soft" initialised
I 12:16:05.105 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,104 DEBUG Request 6CDEEF07 Persistence:debug:58 - Object Manager "org.datanucleus.ObjectManagerImpl@1456e6b" opened for datastore "com.google.appengine.datanucleus.DatastoreManager@ba090c" with txn="org.datanucleus.TransactionImpl@1544f26"
I 12:16:05.107 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,106 DEBUG Request 6CDEEF07 Cache:debug:58 - Object with id "com.eurekaapp.server.dao.mappedobjects.DAOJob:5351674944159744" not found in Level 1 cache [cache size = 0]
I 12:16:05.108 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,107 DEBUG Request 6CDEEF07 Cache:debug:58 - Object with id "com.eurekaapp.server.dao.mappedobjects.DAOJob:5351674944159744" not found in Level 2 cache
I 12:16:05.109 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,108 DEBUG Request 6CDEEF07 Cache:debug:58 - Object "com.eurekaapp.server.dao.mappedobjects.DAOJob@4adf6a" (id="com.eurekaapp.server.dao.mappedobjects.DAOJob:5351674944159744") added to Level 1 cache (loadedFlags="[NNNNNNNNNNNNNNNNNNNNYNNNNNNNNNNNNNNNNNNNNNNN]")
I 12:16:05.181 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,109 DEBUG Request 6CDEEF07 Lifecycle:debug:58 - Object "com.eurekaapp.server.dao.mappedobjects.DAOJob@4adf6a" (id="com.eurekaapp.server.dao.mappedobjects.DAOJob:5351674944159744") has a lifecycle change : "HOLLOW"->"P_NONTRANS"
I 12:16:05.182 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,181 DEBUG Request 6CDEEF07 Connection:debug:58 - Created ManagedConnection using DatastoreService = com.google.appengine.api.datastore.DatastoreServiceImpl@191c505
I 12:16:05.183 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,182 DEBUG Request 6CDEEF07 Connection:debug:58 - Connection added to the pool : com.google.appengine.datanucleus.DatastoreConnectionFactoryImpl$DatastoreManagedConnection@11de9d0 for key=org.datanucleus.ObjectManagerImpl@1456e6b in factory=ConnectionFactory:nontx[com.google.appengine.datanucleus.DatastoreConnectionFactoryImpl@f2b4dc]
I 12:16:05.185 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,184 DEBUG Request 6CDEEF07 Connection:debug:58 - Connection found in the pool : com.google.appengine.datanucleus.DatastoreConnectionFactoryImpl$DatastoreManagedConnection@11de9d0 for key=org.datanucleus.ObjectManagerImpl@1456e6b in factory=ConnectionFactory:nontx[com.google.appengine.datanucleus.DatastoreConnectionFactoryImpl@f2b4dc]
I 12:16:05.186 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,185 DEBUG Request 6CDEEF07 Native:debug:58 - Getting entity of kind DAOJob with key DAOJob(5351674944159744)
I 12:16:05.196 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,195 DEBUG Request 6CDEEF07 Retrieve:debug:58 - Fetching object "com.eurekaapp.server.dao.mappedobjects.DAOJob@4adf6a" (id=5351674944159744) fields [acceptStatus,check1,check2,check3,check4,check5,collectionAddress,companyID,containerCode,customerName,customerref,deliveryLatitude,deliveryLongitude,deliveryaddress,deliverytime,enumStatus,groupID,instructions,jobType,jobTypeID,key,lastmodified,localID,notes,parsingSuccessfull,quantity1,quantity2,quantity3,quantity4,ref1,ref2,ref3,ref4,ref5,required_ItemCount,required_Note,required_POD,required_Signature,required_SignatureName,trailerCode,uniqueField,userID,vehicleCode,weight]
I 12:16:05.197 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,196 DEBUG Request 6CDEEF07 Retrieve:debug:58 - Object "com.eurekaapp.server.dao.mappedobjects.DAOJob@4adf6a" (id="5351674944159744") being retrieved from AppEngine
I 12:16:05.199 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,197 DEBUG Request 6CDEEF07 Persistence:debug:58 - Object "com.eurekaapp.server.dao.mappedobjects.DAOJob@4adf6a" (id="com.eurekaapp.server.dao.mappedobjects.DAOJob:5351674944159744") is having the value in field "deliverytime" replaced by a SCO wrapper
I 12:16:05.200 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,199 DEBUG Request 6CDEEF07 Persistence:debug:58 - Object "com.eurekaapp.server.dao.mappedobjects.DAOJob@4adf6a" (id="com.eurekaapp.server.dao.mappedobjects.DAOJob:5351674944159744") is having the value in field "lastmodified" replaced by a SCO wrapper
I 12:16:05.201 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,200 DEBUG Request 6CDEEF07 Connection:debug:58 - Connection found in the pool : com.google.appengine.datanucleus.DatastoreConnectionFactoryImpl$DatastoreManagedConnection@11de9d0 for key=org.datanucleus.ObjectManagerImpl@1456e6b in factory=ConnectionFactory:nontx[com.google.appengine.datanucleus.DatastoreConnectionFactoryImpl@f2b4dc] but owner object closing so closing connection
I 12:16:05.202 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,201 DEBUG Request 6CDEEF07 Connection:debug:58 - Connection removed from the pool : com.google.appengine.datanucleus.DatastoreConnectionFactoryImpl$DatastoreManagedConnection@11de9d0 for key=org.datanucleus.ObjectManagerImpl@1456e6b in factory=ConnectionFactory:nontx[com.google.appengine.datanucleus.DatastoreConnectionFactoryImpl@f2b4dc]
I 12:16:05.203 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,202 DEBUG Request 6CDEEF07 Persistence:debug:58 - Disconnecting com.eurekaapp.server.dao.mappedobjects.DAOJob@4adf6a from StateManager[pc=com.eurekaapp.server.dao.mappedobjects.DAOJob@4adf6a, lifecycle=P_NONTRANS]
I 12:16:05.204 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,203 DEBUG Request 6CDEEF07 Cache:debug:58 - Object with id="com.eurekaapp.server.dao.mappedobjects.DAOJob:5351674944159744" being removed from Level 1 cache [current cache size = 1]
I 12:16:05.205 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,204 DEBUG Request 6CDEEF07 Cache:debug:58 - Level 1 Cache cleared
I 12:16:05.206 [s~server-test-/17.383086902326406416].<stdout>: 12:16:05,205 DEBUG Request 6CDEEF07 Persistence:debug:58 - Object Manager "org.datanucleus.ObjectManagerImpl@1456e6b" closed
-有什么建议吗?
【问题讨论】:
-
我已手动进入并将数据存储中的双精度值更新为 0.0 并保存。
-
您在更新此值时是否将类型设置为“float”?另外,记得清除缓存。
-
嗨 Andrei,不,类型设置为双精度。我正在解析 JSON 中的所有双精度值,并使用设置器设置它们,这些设置器在持久化之前设置对象上的每个双精度值。不过,我从不清除缓存,与此相关的好的做法是什么?什么时候是清理的好时机,比如每隔一小时左右?
-
Datastore 查看器中只有
float和int类型。在内部,所有值都存储为 Double 或 Long。除非您通过 Datastore 查看器进行手动更改,或者您对数据模型等进行更改,否则您不需要清除缓存。 -
啊,所以我真的不应该使用数据存储查看器来编辑我的数据。很公平。这可能是造成这种情况的原因。假设虽然这个错误再次发生,但我正在考虑提供一种允许管理员调用“清理缓存”方法的方法。你知道这个错误是否经常发生吗?你认为我提供这种方法有必要吗?我知道这没有必要,但我不能让这个错误发生。我的项目只是在上线之后,我正在慢慢增加用户。我将尝试通过在数据存储查看器中编辑双精度值来重现此问题
标签: java google-app-engine jdo