如何映射 xml,它使用 xsi:type 和推土机?

How to map an xml, which uses xsi:type with dozer?

我有一个 xml,它使用 xsi:type 属性,所以 "BaseData" 元素可以包含 "ChildField" 元素,尽管 "ChildField" 元素不是架构中 "BaseData" 元素的成员:

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

生成的java代码为:

Child:

@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 文件中时,它失败了:

<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

方法

我通过创建一个将 BaseClass 转换为 MyClass 的自定义转换器解决了这个问题。它首先尝试将 BaseClass 实例转换为 ChildClass。如果成功,则它将字段值传递给 MyClass 实例。