do – dozer中的多态性

我有四节课:

public class A { }
public class B extends A { }
public class C extends B { }
public class D extends B { }

从我在推土机文档中读到的有关继承的内容来看,它必须非常简单,我需要将超类映射到彼此,以及子类.
以下是它在xml中的外观:

<mapping>
<class-a>foo.A</class-a>
<class-b>foo.bar.A</class-b>
</mapping>

<mapping>
<class-a>foo.B</class-a>
<class-b>foo.bar.B</class-b>
</mapping>

<mapping>
<class-a>foo.C</class-a>
<class-b>foo.bar.C</class-b>
</mapping>

<mapping>
<class-a>foo.D</class-a>
<class-b>foo.bar.D</class-b>
</mapping>

所有这些类都是相同的,我的意思是D和D具有相同的属性,C和C等等.

问题:
在我传递给推土机的对象中,我有一个B类属性,可以用C或D(多态)初始化.
当dozer返回新的映射对象时,它总是将B的属性类型返回给我,而不是C或D.
如何解决这个问题?

解决方法:

请查看Inheritance Mapping section.您可以将这种映射用于具有子类的字段类.

<mapping>
    <class-a>foo.Source</class-a>
    <class-b>foo.Dest</class-b>
    <field>
      <a>attr</a>
      <b>attr</b>
      <a-hint>foo.B, foo.C, foo.D</a-hint>
      <b-hint>foo.bar.B, foo.bar.C, foo.bar.D</b-hint>
   </field>
</mapping>

编辑:我实现了某种类型的自动多态feature request.我认为,它将包含在下一个Dozer版本中.

上一篇:php – Laravel删除可能存在错误关系的多态关系


下一篇:c# – 在没有警告的情况下隐藏基类的显式接口实现的目的?