Как сопоставить xml, который использует xsi: type с бульдозером?

У меня есть xml, в котором используется атрибут xsi: type, поэтому элемент «BaseData» может содержать элемент «ChildField», несмотря на то, что элемент «ChildField» не является членом элемента «BaseData» в схеме:

<BaseData xsi:type="Child">
    <ChildField>value</ChildField>
</BaseData>

Сгенерированный Java-код:

Ребенок:

@XmlSeeAlso({
    Child.class,
})
public class BaseData {}

База:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Child", propOrder = {
    "childField"
})
public class Child extends BaseData
{
    @XmlElement(name = "ChildField")
    protected String childField;
}

Теперь, наконец, я хочу, чтобы эта структура сопоставлялась с моей структурой, но когда я помещаю это в xml-файл сопоставления dozer, это не удается:

<field>
    <a>baseData</a>
    <b>myData</b>
    <a-hint>BaseData,Child</a-hint>
    <b-hint>MyClass</b-hint>
</field>

<field>
    <a>baseData.childField</a>
    <b>myData.myField</b>
</field>

Исключение, которое я получаю:

org.dozer.MappingException: No read or write method found for field (baseData.childField) in class (class BaseData)

я использую

mapper.map

метод


person xMichal    schedule 12.04.2017    source источник


Ответы (1)


Я решил эту проблему, создав собственный преобразователь, который преобразует BaseClass в MyClass. Сначала он пытается преобразовать экземпляр BaseClass в ChildClass. В случае успеха он передает значения поля экземпляру MyClass.

person xMichal    schedule 18.04.2017