JAXB | MOXy | EclipseLink - JAXB无法映射java接口com.domain.Entity,因为它具有多个可映射的父接口

时间:2015-02-14 14:55:09

标签: jaxb eclipselink marshalling unmarshalling moxy

所以我遇到了一个问题,我试图将复杂的bean结构转换为XML格式。

我在同一个包中有五个类(带注释)。

每个类扩展一个抽象类并实现一个接口:

@Entity
@Table(name = SubscriptionInvoiceItemChargesImpl.TABLE_NAME)
@DataCache(enabled = false)
public class SubscriptionInvoiceItemChargesImpl extends AbstractEntityImpl implements SubscriptionInvoiceItemCharges {

这是abstractEntityImpl类:

public abstract class AbstractEntityImpl extends AbstractPersistenceImpl implements Entity {

这是实体接口:

public interface Entity extends PureEntity, Persistence {

}

现在,我想要的只是将我的5个类中定义的方法(通过组合相互依赖)写入XML并且不要求父类/接口中的任何数据。

jaxb.properties的内容:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

这是绑定文件:

<?xml version="1.0"?>
<xml-bindings 
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="com.domain.ecomm.impl">
    <java-types>
        <java-type name="SubscriptionContactImpl" super-type="java.lang.Object"/>
    </java-types>
    <java-types>
        <java-type name="SubscriptionInvoiceItemChargesImpl" super-type="java.lang.Object"/>
    </java-types>
    <java-types>
        <java-type name="SubscriptionInvoiceItemImpl" super-type="java.lang.Object"/>
    </java-types>
    <java-types>
        <java-type name="SubscriptionAccountImpl" super-type="java.lang.Object"/>
    </java-types>
    <java-types>
        <java-type name="SubscriptionImpl" super-type="java.lang.Object"/>
    </java-types>

</xml-bindings>

这是编组编码:

InputStream is = ZuoraServiceImpl.class.getClassLoader().getResourceAsStream("com/domain/ecomm/impl/subscription-bindings.xml");    
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, is);
    JAXBContext jc;
    try {
        jc = JAXBContext.newInstance(new Class[] {SubscriptionContactImpl.class}, properties);
         Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(subscriptionContact, System.out);    
    } catch (JAXBException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

运行代码会给我以下错误:

Exception Description: The java interface com.domain.Entity can not be mapped by JAXB as it has multiple mappable parent interfaces. Multiple inheritence is not supported]

使用maven依赖:

<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>eclipselink</artifactId>
    <version>2.5.2</version>
</dependency>

&#39;实体&#39; interface与其他类的包不同。 我会很感激任何指针。

1 个答案:

答案 0 :(得分:0)

eclipselink解析器中存在一个错误,因为使用了 jaxb.properties 内容

  

javax.xml.bind.context.factory的= com.sun.xml.internal.bind.v2.ContextFactory

jaxb.properties必须在与要序列化的类相同的包中的类路径中

另一个方面是使用eclipselink jaxb实现的 2.6.0 版本