【问题标题】:org.datanucleus.store.types.sco.simple.HashSet cannot be cast to java.util.Dateorg.datanucleus.store.types.sco.simple.HashSet 不能转换为 java.util.Date
【发布时间】:2018-02-02 11:14:57
【问题描述】:

从最近几天突然我们的生产部署应用程序抛出此错误

org.datanucleus.store.types.sco.simple.HashSet 无法转换为 java.util.Date

我们正在使用 datanucleus-api-jpa- 3.1.3、datanucleus-api-jdo- 3.1.3 和 Java 1.7

它发生在我们检索条目时。

我已经检查了所有事情,但没有找到导致这种情况发生的根本原因。我已经检查了这个链接 1) stackoverflow-questionId-22307734 (2) datanucleus-javadocs (3) gae-jdo-docs

示例代码:

import java.util.Date;

import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;


@PersistenceCapable
public class MyClass {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long Id;

    @Persistent
    private String domainName;

    @Persistent
    private String customerName;

    @Persistent
    private String companyName;

    @Persistent
    private Date installationDate;

    @Persistent
    private Date renewalDate;
    .....
    getter...
    setter...
}

异常消息完整堆栈跟踪:

异常消息:org.datanucleus.store.types.sco.simple.HashSet 无法转换为 java.util.Date (ErrorHandler.java:10) 2018-02-02 00:15:28.671 IST com.company.projectname.classnames.ErrorHandler errorHandler:DataAccessLayer 类中的错误 (ErrorHandler.java:11) 2018-02-02 00:15:28.672 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) com.company.projectname.dataaccesslayer.MyClass.jdoReplaceField(MyClass.java) 2018-02-02 00:15:28.672 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) org.datanucleus.state.AbstractStateManager.replaceField(AbstractStateManager.java:2387) 2018-02-02 00:15:28.672 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) org.datanucleus.state.JDOStateManager.replaceField(JDOStateManager.java:1877) 2018-02-02 00:15:28.672 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) org.datanucleus.state.JDOStateManager.replaceField(JDOStateManager.java:1781) 2018-02-02 00:15:28.672 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) org.datanucleus.store.types.sco.SCOUtils.createSCOWrapper(SCOUtils.java:241) 2018-02-02 00:15:28.672 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) org.datanucleus.store.types.sco.SCOUtils.newSCOInstance(SCOUtils.java:139) 2018-02-02 00:15:28.672 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) org.datanucleus.state.JDOStateManager.wrapSCOField(JDOStateManager.java:2230) 2018-02-02 00:15:28.672 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) com.google.appengine.datanucleus.FetchFieldManager.fetchFieldFromEntity(FetchFieldManager.java:468) 2018-02-02 00:15:28.673 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) com.google.appengine.datanucleus.FetchFieldManager.fetchObjectField(FetchFieldManager.java:408) 2018-02-02 00:15:28.673 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) org.datanucleus.state.AbstractStateManager.replacingObjectField(AbstractStateManager.java:2353) 2018-02-02 00:15:28.673 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) com.company.projectname.dataaccesslayer.MyClass.jdoReplaceField(MyClass.java) 2018-02-02 00:15:28.673 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) com.company.projectname.dataaccesslayer.MyClass.jdoReplaceFields(MyClass.java) 2018-02-02 00:15:28.673 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) org.datanucleus.state.JDOStateManager.replaceFields(JDOStateManager.java:1935) 2018-02-02 00:15:28.673 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) org.datanucleus.state.JDOStateManager.replaceFields(JDOStateManager.java:1962) 2018-02-02 00:15:28.673 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) com.google.appengine.datanucleus.EntityUtils$1.fetchFields(EntityUtils.java:974) 2018-02-02 00:15:28.673 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) org.datanucleus.state.JDOStateManager.loadFieldValues(JDOStateManager.java:764) 2018-02-02 00:15:28.673 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) org.datanucleus.state.JDOStateManager.initialiseForHollow(JDOStateManager.java:205) 2018-02-02 00:15:28.673 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) org.datanucleus.state.StateManagerFactory.newForHollowPopulated(StateManagerFactory.java:89) 2018-02-02 00:15:28.674 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) org.datanucleus.state.ObjectProviderFactory.newForHollowPopulated(ObjectProviderFactory.java:75) 2018-02-02 00:15:28.674 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) org.datanucleus.ObjectManagerImpl.findObject(ObjectManagerImpl.java:2882) 2018-02-02 00:15:28.674 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) com.google.appengine.datanucleus.EntityUtils.entityToPojo(EntityUtils.java:1014) 2018-02-02 00:15:28.674 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) com.google.appengine.datanucleus.query.DatastoreQuery$2.apply(DatastoreQuery.java:229) 2018-02-02 00:15:28.674 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) com.google.appengine.datanucleus.query.DatastoreQuery$2.apply(DatastoreQuery.java:226) 2018-02-02 00:15:28.674 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) com.google.appengine.datanucleus.query.LazyResult.resolveNext(LazyResult.java:96) 2018-02-02 00:15:28.674 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) com.google.appengine.datanucleus.query.LazyResult.resolveAll(LazyResult.java:121) 2018-02-02 00:15:28.674 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) com.google.appengine.datanucleus.query.LazyResult.size(LazyResult.java:115) 2018-02-02 00:15:28.674 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) com.google.appengine.datanucleus.query.StreamingQueryResult.size(StreamingQueryResult.java:151) 2018-02-02 00:15:28.675 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) org.datanucleus.store.query.AbstractQueryResult.toArray(AbstractQueryResult.java:400) 2018-02-02 00:15:28.675 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) java.util.ArrayList.addAll(ArrayList.java:559) 2018-02-02 00:15:28.675 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) com.company.projectname.datastore.DataAccessLayer.searchObjects(DataAccessLayer.java:217) 2018-02-02 00:15:28.675 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) com.company.projectname.businessaccesslayer.Manager.getCustomeAppByURL(Manager.java:1475) 2018-02-02 00:15:28.675 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) com.company.projectname.sso.apps.marketplace.ServletTest.doGet(ServletTest.java:155) 2018-02-02 00:15:28.675 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 2018-02-02 00:15:28.675 IST com.company.projectname.classnames.ErrorHandler errorHandler:
(ErrorHandler.java:14) javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

谢谢。

【问题讨论】:

    标签: java google-app-engine google-cloud-platform google-cloud-datastore datanucleus


    【解决方案1】:

    这更多是数据问题而不是代码问题。在将数据保存或上传到存储之前,您是如何清理数据的?

    因此,您检索到的数据中的一些所谓的“日期”字段实际上并不是正确的“日期”字段。最好的方法是一次检索少量数据,然后将其拆分为每个结果的唯一可识别字段。

    所以您会看到“John, David, Kate, ERROR”,并且您会知道在您的 Kate 条目中的某处,日期字段并不像看起来那样。它可能是编码问题或格式问题,也可能只是截断问题。但无论哪种方式,错误在于您的数据,而不是您的代码。因此,这个问题只会偶尔发生一次(当它遇到坏数据时)。

    【讨论】:

    • 我同意你@Ying Li,你所说的错误是数据的。但这真的让我感到困惑或无法理解,因为我在一天中检索了 5-6 次相同的条目,而且这个条目一年只会更新一次。因此,我可以从过去 5-6 个月中检索到相同的条目而没有任何错误,并且现在无法检索。我们这边没有数据库结构更改或代码更改。
    • 另外,我们总是为特定客户检索数据所以当我们检索数据时它只包含一个条目。
    • 不确定 PersistantManager 是线程安全的。这可能是线程问题吗?
    • 基于link 它声明“PersistenceManagerFactory 被设计为线程安全的。PersistenceManager 不是”
    • 如果没有数据损坏或更新,并且您确定相同的数据被击中但它只是“有时”错误,那么它可能是一个错误或 GCP 支持可以为您调查的问题.您能否尝试以“可识别”的方式提取数据并确定它是否是导致错误的相同条目?如果是这样,条目本身有什么特别之处吗?
    猜你喜欢
    • 1970-01-01
    • 2019-05-05
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 2011-08-29
    相关资源
    最近更新 更多