我有一个实体列表,而这些实体又有另一个(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 。
我怎样才能做到这一点?
答案 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(...)映射通用集合时;包含泛型集合作为字段的实体应该映射得很好。