JAXB | МОКСИ | EclipseLink - JAXB не может сопоставить java-интерфейс com.domain.Entity, так как он имеет несколько сопоставляемых родительских интерфейсов.

Поэтому я столкнулся с проблемой, когда я пытаюсь преобразовать сложную структуру компонента в формат 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 {

Вот интерфейс Entity:

public interface Entity extends PureEntity, Persistence {

}

Теперь все, что я хочу, - это просто записать в XML методы, определенные в моих 5 классах (зависящих друг от друга посредством композиции), и НЕ требовать каких-либо данных от родительских классов / интерфейсов.

Содержание 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>

Интерфейс "Entity" находится в другом пакете, чем другие классы. был бы признателен за любые указатели.

1 ответ

В синтаксическом анализаторе eclipselink есть ошибка. В качестве временного решения используются свойства jaxb.properties

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

jaxb.properties должен находиться в пути к классам в том же пакете, что и сериализуемый вами класс

Другой обходной путь - использовать версию 2.6.0 реализации eclipselink jaxb.

Другие вопросы по тегам