【问题标题】:How to map a field with type as an abstract class with dozer?如何使用推土机将具有类型的字段映射为抽象类?
【发布时间】:2011-12-12 10:23:33
【问题描述】:

我的域结构如下:

abstract class Person { String name; //with getter and setter }
class Employer extends Person {}
class Employee extends Person {}
class Contract { Person contractor; //with getter and setter }
class PersonDTO implements Serializable { String name; String type; //type == 'Employee' or 'Employer' }
class ContractDTO implements Serializable { PersonDTO contractor; }

现在,当我设置以下推土机映射时:

<mapping>
   <class-a>Person</class-a>
   <class-b>PersonDTO</class-b>
</mapping>
<mapping>
   <class-a>Employer</class-a>
   <class-b>PersonDTO</class-b>
</mapping>
<mapping>
   <class-a>Contract</class-a>
   <class-b>ContractDTO</class-b>
</mapping>

我的问题涉及到字段 Contract.contractor 从 B 到 A 的映射,因为字段 Contract.contractor 是一个抽象类,推土机无法猜测如何实例化它。

所以我的问题很简单:我如何向推土机表明,对于字段 Contract.contractor 的映射,它应该实例化 Employer if type == 'Employer' 和其他地方 Employee 的实例?

感谢您的帮助。

【问题讨论】:

  • 您的 Person 类是抽象的,但我猜它必须是运行时任何继承类的实例?源对象的contractor属性是如何创建的?
  • @Gonzalo 我不明白你的问题。承包商是雇主或雇员,它是通过 setContractor(Personcontractor) 方法设置的
  • 没错,在运行时,Person 是您提到的这两种类型之一,Dozer 应该能够弄清楚这一点并正确转换具体类型。 Dozer 不会尝试创建抽象类的实例,而是创建承包商在运行时引用的实际对象(Employer 或 Employee)的实例。你遇到了什么样的错误?
  • @Gonzalo 我已经更新了问题以使其清楚。现在,PersonDTO 有一个属性“type”,它清楚地表明了 Person 的类型(Employee 或 Employer)。如果 type == 'Employer' ,我如何告诉 Dozer 实例化雇主?
  • 我认为您需要一个自定义转换器来处理这种类型的逻辑。 dozer.sourceforge.net/documentation/customconverter.html 使用自定义转换器,您可以实现任何您想要定义转换过程输出的逻辑

标签: java dozer


【解决方案1】:

你可以通过提示来做到这一点。 有点像这样:

<mapping>
 <class-a>Contract</class-a>
 <class-b>ContractDTO</class-b>
 <field>
   <a>contractor</a>
   <b>contractor</b>
   <a-hint>your.package.Employer, your.package.Employee</a-hint>
   <b-hint>your.DTOpackage.EmployerDTO, your.DTOpackage.EmployeeDTO</b-hint>
 </field>
</mapping>

【讨论】:

  • 如果contractor是Employee的一个实例?
猜你喜欢
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多