Java 例外情况:;数据库行[UnmarshalRecordImpl()]中缺少类指示符字段。”;使用EclipseLink JAXB(MOXy)解组XML时

Java 例外情况:;数据库行[UnmarshalRecordImpl()]中缺少类指示符字段。”;使用EclipseLink JAXB(MOXy)解组XML时,java,jaxb,eclipselink,jaxb2,moxy,Java,Jaxb,Eclipselink,Jaxb2,Moxy,是否有任何方法可以在下一个XML中使用@XmlDescriptionatorNode/@XmlDescriptionAtorValue注释解组,或任何解决方法: 我的映射类: @XmlRootElement(name=“data\u文件”) @XmlAccessorType(XmlAccessType.FIELD) @XmlDiscriminatorValue(“源”) 公共类SourceDataFile扩展了BaseDataFile{ } @XmlRootElement(name=“d

是否有任何方法可以在下一个XML中使用@XmlDescriptionatorNode/@XmlDescriptionAtorValue注释解组,或任何解决方法:


我的映射类:

@XmlRootElement(name=“data\u文件”)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlDiscriminatorValue(“源”)
公共类SourceDataFile扩展了BaseDataFile{
}
@XmlRootElement(name=“data\u文件”)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlDiscriminatorValue(“源”)
公共类SourceDataFile扩展了BaseDataFile{
}
@XmlRootElement(name=“data\u文件”)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlDiscriminatorValue(“扩展”)
公共类SourceDataFile扩展了BaseDataFile{
}
@XmlRootElement(name=“asset”)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlDiscriminatorNode(“类型”)
公共抽象类BaseAsset实现了可序列化{
@XmlPath(“@type”)
@XmlAttribute(name=“type”)
私有字符串类型;
@XmlPath(“数据文件”)
私有列表数据文件;
公共列表getDataFiles(){
返回数据文件;
}
公共void setDataFiles(列出数据文件){
this.dataFiles=数据文件;
}
公共字符串getType(){
返回类型;
}
公共void集合类型(字符串类型){
this.type=type;
}
}
如果XML包含如下元素,但没有“type”属性,则会发生错误:



提前感谢

以下内容应该会有所帮助:

JAVA模型

超级类(
BaseDataFile

下面是
BaseDataFile
类的简化版本。由于已将XML属性
角色
映射为继承指示符,因此无需将其也映射到对象模型中的属性

import java.io.Serializable;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlDiscriminatorNode;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({SourceDataFile.class, ExtensionDataFile.class})
@XmlDiscriminatorNode("@role")
public abstract class BaseDataFile implements Serializable {

}
如果确实要将
角色
XML属性映射到对象模型中的属性,则应使用MOXy的
@XmlReadOnly
属性,以防止将其封送到XML文档中(它已作为继承指示符写入)

子类(
SourceDataFile


缺少继承指标

基类不是抽象的

如果您的基类(
BaseDataFile
)不是抽象的,那么如果继承指示符缺少基类的实例,则会创建基类的实例

基类是抽象的

由于基类是抽象的,因此缺少继承指示符值:

Exception in thread "main" Local Exception Stack: 
Exception [EclipseLink-44] (Eclipse Persistence Services - @VERSION@.@QUALIFIER@): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Missing class indicator field from database row [UnmarshalRecordImpl()].
Descriptor: XMLDescriptor(forum15597322.BaseDataFile --> [])
    at org.eclipse.persistence.exceptions.DescriptorException.missingClassIndicatorField(DescriptorException.java:957)
    at org.eclipse.persistence.internal.oxm.XMLRelationshipMappingNodeValue.processChild(XMLRelationshipMappingNodeValue.java:83)
    at org.eclipse.persistence.internal.oxm.XMLCompositeCollectionMappingNodeValue.startElement(XMLCompositeCollectionMappingNodeValue.java:184)
    at org.eclipse.persistence.internal.oxm.record.UnmarshalRecordImpl.startElement(UnmarshalRecordImpl.java:834)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:506)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:376)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2715)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:116)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:488)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568)
    at org.eclipse.persistence.internal.oxm.record.XMLReader.parse(XMLReader.java:221)
    at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:895)
    at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:388)
    at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:366)
    at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:323)
    at org.eclipse.persistence.oxm.XMLUnmarshaller.unmarshal(XMLUnmarshaller.java:367)
    at org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:123)
    at forum15597322.Demo.main(Demo.java:23)

忽略错误

在编组/解编到
ValidationEventHandler
过程中遇到的实现(包括MOXy报告异常)当遇到缺少的继承指示符值时,默认的实现将出错。下面是一个设置自定义
ValidationEventHandler
的示例,通过从
handleEvent
方法返回
true
,该示例显示永不出错

    Unmarshaller unmarshaller = jc.createUnmarshaller();
    unmarshaller.setEventHandler(new ValidationEventHandler() {
        @Override
        public boolean handleEvent(ValidationEvent event) {
            return true;
        }

    });
当把这个答案放在一起时,我发现了下面的MOXy错误,由于执行上述操作,它会将一个无效的文本值作为集合中的一个项。该补丁针对EclipseLink 2.5.1

一旦修复进入,无效条目将被忽略。这就是你想要的行为吗


了解更多信息


很抱歉弄错了,但若handleEvent方法返回true,则在解组后,实体中的值无效。因此,我仍在等待解决此问题。@EvgeniyFitner-您可以使用以下错误跟踪我们在该问题上的进展:
import java.io.Serializable;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlDiscriminatorNode;
import org.eclipse.persistence.oxm.annotations.XmlReadOnly;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({SourceDataFile.class, ExtensionDataFile.class})
@XmlDiscriminatorNode("@role")
public abstract class BaseDataFile implements Serializable {

    @XmlAttribute
    @XmlReadOnly
    String role;

}
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlDiscriminatorValue;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlDiscriminatorValue("source")
public class SourceDataFile extends BaseDataFile {

}
Exception in thread "main" Local Exception Stack: 
Exception [EclipseLink-44] (Eclipse Persistence Services - @VERSION@.@QUALIFIER@): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Missing class indicator field from database row [UnmarshalRecordImpl()].
Descriptor: XMLDescriptor(forum15597322.BaseDataFile --> [])
    at org.eclipse.persistence.exceptions.DescriptorException.missingClassIndicatorField(DescriptorException.java:957)
    at org.eclipse.persistence.internal.oxm.XMLRelationshipMappingNodeValue.processChild(XMLRelationshipMappingNodeValue.java:83)
    at org.eclipse.persistence.internal.oxm.XMLCompositeCollectionMappingNodeValue.startElement(XMLCompositeCollectionMappingNodeValue.java:184)
    at org.eclipse.persistence.internal.oxm.record.UnmarshalRecordImpl.startElement(UnmarshalRecordImpl.java:834)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:506)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:376)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2715)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:116)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:488)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568)
    at org.eclipse.persistence.internal.oxm.record.XMLReader.parse(XMLReader.java:221)
    at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:895)
    at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:388)
    at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:366)
    at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:323)
    at org.eclipse.persistence.oxm.XMLUnmarshaller.unmarshal(XMLUnmarshaller.java:367)
    at org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:123)
    at forum15597322.Demo.main(Demo.java:23)
    Unmarshaller unmarshaller = jc.createUnmarshaller();
    unmarshaller.setEventHandler(new ValidationEventHandler() {
        @Override
        public boolean handleEvent(ValidationEvent event) {
            return true;
        }

    });