JAXB не может разобрать - PullRequest
       19

JAXB не может разобрать

0 голосов
/ 18 сентября 2019

Я не могу удалить общий тип, как этот.Мне не нравится это решать с помощью адаптера класса.Может ли кто-нибудь помочь ..

interface Car {
}


class Car1 implements Car {
}

class Car2 implements Car {
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType( name = "", propOrder = { "car1" } )
@XmlRootElement(name = "Element")
class Element{

@XMLELEMENT(type="Car1.class" name="Car")
private Car car1;

}

1 Ответ

0 голосов
/ 19 сентября 2019

Если xml, который вы пытаетесь разобрать, имеет разные теги для описания car1 и car2, то это возможно с помощью аннотации @XmlElements.

Я создаю небольшой пример ниже, чтобы показать его:

@XmlRootElement
public class SomeRoot {

    @XmlElements({
            @XmlElement(type = Car1.class, name = "car1"),
            @XmlElement(type = Car2.class, name = "car2")
    })
    private List<Car> cars;
}

Затем ваш интерфейс:

public interface Car {
}

Базовый класс с некоторым общим полем:

@XmlAccessorType(XmlAccessType.FIELD)
public class BaseCar {

    private String type;
}

И реализация для car1:

@XmlAccessorType(XmlAccessType.FIELD)
public class Car1 extends BaseCar implements Car {
    private String car1SpecificField;

}

и car2:

@XmlAccessorType(XmlAccessType.FIELD)
public class Car2 extends BaseCar implements Car {
    private String car2SpecificField;
}

Это приведет к разбивке xml ниже штрафа:

<someRoot>
    <car1>
        <type>some type</type>
        <car1SpecificField>some value</car1SpecificField>
    </car1>
    <car2>
        <type>other type</type>
        <car2SpecificField>other value</car2SpecificField>
    </car2>
</someRoot>

Если ваш xml имеет <car> вместо <car1> и <car2>, вам нужно использовать адаптер, иначе jaxb не знает, какой класс нужно отменять.

...