如何映射 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 实例。
我有一个 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 实例。