2013-03-24 42 views
2

这是任何方式与@ XmlDescriminatorNode/@ XmlDescrimintatorValue注释旁边XML来解组,或任何解决方法:异常:“缺少数据库行[UnmarshalRecordImpl()]中的类指示符字段”。解组使用的EclipseLink JAXB(莫西)XML时

<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> 

我的映射类:

@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; 
    } 
} 

错误occures如果XML containes要素如下,没有“类型”属性:

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

在此先感谢

回答

2

以下应该有所帮助:

Java模型

超级(0123))

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

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属性的属性映射在你的对象模型,你应该使用莫西的@XmlReadOnly属性以防止它被编组到XML文档(这将已经wriiten为继承指示) 。

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

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

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

} 

MISSING遗产INDICATOR

基类不是摘要

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

基类是抽象

由于您的基类抽象MOXY抱怨缺少遗传指标值:

Exception in thread "main" Local Exception Stack: 
Exception [EclipseLink-44] (Eclipse Persistence Services - @[email protected]@[email protected]): 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)实现包括MOXy报告在编组/编组到ValidationEventHandler期间遇到的例外情况,当遇到遗漏的继承指示符值时,默认的错误将会出错。以下是设置自定义ValidationEventHandler的示例,该说明从handleEvent方法返回true表示从不出错。

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

    }); 

,而把这个答案在一起我发现下面的莫西错误,这是上面做的结果会放一个无效的文本值集合中的一个项目。该修补程序针对EclipseLink 2.5.1。

一旦修复进去无效项只会被忽略。这是你正在寻找的行为?


了解更多信息

+1

感谢您的帮助。 – 2013-03-26 08:05:22

+0

对不起混淆,但是如果handleEvent方法返回true,那么在解组之后,我在实体中有无效的值。所以,我仍在等待解决这种情况。 – 2013-03-26 17:35:14

+0

@EvgeniyFitsner - 您可以使用以下错误跟踪我们在此问题上的进展:http://bugs.eclipse.org/404269 – 2013-03-26 17:47:15

相关问题