如何使用带有Dozer的CustomConverter将多个实体转换为带有列表字段的实体?

时间:2014-07-16 16:56:19

标签: converter dozer

我有一个实体列表,而这些实体又有另一个(Embeddable)类型的字段。
所有这些实体应转换为单个bean,其中包含这些可嵌入类型的列表。 在使用Dozer之前,我已经编写了一个转换方法。我把它放到了dozerBeanMapping.xml:

<custom-converters>
    <converter type="com.foo.bar.helper.ChargingPoiEntityToPoiConverter" >
        <class-a>com.foo.bar.services.charging.repository.ChargingPoiEntity</class-a>
        <class-b>com.foo.bar.beans.ChargingPoi</class-b>
  </converter>
</custom-converters> 

我以这种方式实例化Dozer:

final Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance();

我必须调用哪种地图方法? 使用

mapper.map(cpEntities, Cp.class);

我的自定义转换器未被调用。

尝试调用

mapper.map(cpEntities.get(0), Cp.class);

效果很好,但我必须转换一个List&lt; ChargingPoiEntity &gt;而不是单个 ChargingPoiEntity

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

mapper.map(cpEntities, Cp.class);与自定义转换器不匹配,因为List<ChargingPoiEntity>中的通用类型信息已丢失。 Dozer将cpEntities类视为java.util.ArrayList,与com.foo.bar.services.charging.repository.ChargingPoiEntity不匹配。我的理解是这是Java泛型的限制,而不是Dozer中的问题。

一种解决方法是在ChargingPoiEntity数组和ChargingPoi之间定义自定义转换器:

<custom-converters>
  <converter type="com.foo.bar.helper.ChargingPoiEntityToPoiConverter" >
    <class-a>[Lcom.foo.bar.services.charging.repository.ChargingPoiEntity;</class-a>
    <class-b>com.foo.bar.beans.ChargingPoi</class-b>
  </converter>
</custom-converters>

映射时,可以将cpEntities列表转换为数组:

ChargingPoiEntity[] entityArray = cpEntities.toArray(
            new ChargingPoiEntity[cpEntities.size()]);
ChargingPoi convertedList = mapper.map(entityArray, ChargingPoi.class);

请注意,在这种情况下,执行

时不会调用自定义转换器
mapper.map(cpEntities.get(0), ChargingPoi.class);

此问题仅适用于尝试直接通过mapper.map(...)映射通用集合时;包含泛型集合作为字段的实体应该映射得很好。