例外:“数据库行[UnmarshalRecordImpl()]中缺少类指示符字段。”使用EclipseLink JAXB(MOXy)解组XML时 [英] Exception : "Missing class indicator field from database row [UnmarshalRecordImpl()]." when unmarshalling XML using EclipseLink JAXB (MOXy)

查看:196
本文介绍了例外:“数据库行[UnmarshalRecordImpl()]中缺少类指示符字段。”使用EclipseLink JAXB(MOXy)解组XML时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以使用@ XmlDescriminatorNode / @ XmlDescrimintatorValue注释下一个XML或任何解决方法进行解组:

Is it any way to unmarshalling with @XmlDescriminatorNode/@XmlDescrimintatorValue annotations next XML, or any workaround:

<assets>
    <asset type="full">
        <data_file role="source">
            <locale name="ru-RU"/>
        </data_file>
        <data_file role="extension">
            <locale name="ru-RU"/>
        </data_file>
        <data_file>
            <locale name="ru-RU"/>
        </data_file>
    </asset>
</assets>

我的映射类:

My mapping classes:

@XmlRootElement(name="data_file")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlDiscriminatorNode("@role")
public abstract class BaseDataFile implements Serializable {

    @XmlPath("@role")
    @XmlAttribute(name = "role")
    private String role;

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }
}



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

}



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

}



@XmlRootElement(name="data_file")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlDiscriminatorValue("extension")
public class SourceDataFile extends BaseDataFile {

}



@XmlRootElement(name="asset")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlDiscriminatorNode("@type")
public abstract class BaseAsset implements Serializable {

    @XmlPath("@type")
    @XmlAttribute(name = "type")
    private String type;

    @XmlPath("data_file")
    private List<BaseDataFile> dataFiles;

    public List<BaseDataFile> getDataFiles() {
        return dataFiles;
    }

    public void setDataFiles(List<BaseDataFile> dataFiles) {
        this.dataFiles = dataFiles;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

如果XML包含如下所示的元素,则会发生错误, 类型属性:

The error occures if XML containes element as below, without "type" attribute:

<data_file>
  <locale name="ru-RU"/>
</data_file>

提前致谢

推荐答案

以下内容应该有所帮助:

The following should help:

JAVA模型

超级( BaseDataFile

Super Class (BaseDataFile)

以下是<$>的简化版本c $ c> BaseDataFile class。由于您已将XML属性 role 映射为继承指示符,因此您无需将其映射到对象模型中的属性。

Below is a simplified version of your BaseDataFile class. Since you have mapped the XML attribute role as the inheritance indicator you do not need to also map it to a property in your object model.

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 {

}

如果你真的想要映射 role 对象模型中属性的XML属性应使用MOXy的 @XmlReadOnly 属性来防止它被编组到XML文档(它已经作为继承指示符)。

If you really want to map the role XML attribute to a property in your object model you should use MOXy's @XmlReadOnly property to prevent it being marshalled to the XML document (it will already be wriiten as the inheritance indicator).

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;

}

子类( SourceDataFile

Subclass (SourceDataFile)

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

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

}






缺少继承指标

基类不是抽象

如果您的基类( BaseDataFile )如果缺少继承指示符,则表示基类的实例已经创建。

If your base class (BaseDataFile) had not been abstract then if the inheritance indicator was missing an instance of the base class would have been created.

基类是摘要

由于您的基类是抽象的MOXy抱怨缺少继承指标值:

Since your base class is abstract MOXy complained about the missing inheritance indicator value:

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)






忽略错误

JAXB(JSR-222) 实现,包括在编组/解组到 ValidationEventHandler 默认的一个wi遇到缺少的继承指示符值时会出错。下面是一个设置自定义 ValidationEventHandler 的示例,它通过从 true 来表示永远不会出错> handleEvent 方法。

JAXB (JSR-222) implementations including MOXy report exceptions encountered during marshalling/unmarshaling to a ValidationEventHandler the default one will error out when a missing inheritance indicator value is encountered. Below is an example of setting a custom ValidationEventHandler that says never error out by returning true from the handleEvent method.

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

    });

将这个答案放在一起我发现以下MOXy错误,由于上述操作会放无效的文本值作为集合中的项目。该修复程序针对EclipseLink 2.5.1。

While putting this answer together I found the following MOXy bug which as a result of doing the above will put an invalid text value as an item in the collection. The fix is targeted against EclipseLink 2.5.1.

  • http://bugs.eclipse.org/404269

一旦该修复进入无效条目,将被忽略。这是您正在寻找的行为吗?

Once that fix goes in the invalid entry will just be ignored. Is this the behaviour you are looking for?

更多信息

  • http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-moxy-extension.html
  • http://blog.bdoughan.com/2010/12/jaxb-and-marshalunmarshal-schema.html
  • http://blog.bdoughan.com/2010/07/xpath-based-mapping.html

这篇关于例外:“数据库行[UnmarshalRecordImpl()]中缺少类指示符字段。”使用EclipseLink JAXB(MOXy)解组XML时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆