Как сопоставить xml, который использует xsi:type с dozer?
У меня есть 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 mapping, происходит сбой:
<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
метод
1 ответ
Решение
Я решил эту проблему, создав специальный конвертер, который преобразует BaseClass в MyClass. Сначала он пытается привести экземпляр BaseClass к ChildClass. В случае успеха он передает значения полей экземпляру MyClass.