我正在使用Orika从一个复杂的实体(超过300个字段)映射到另一个实体。只要源实体具有不期望的字段,整个目标实体就会设置为null。我想在字段级别上处理异常(或仅将错误字段设置为null),而不必为Entity创建自定义映射器,并自己进行字段转换(300多个字段)。
创建自定义映射器的工作原理是,我可以完全控制字段,并且可以控制异常。问题在于这种方式我没有利用Orika。
这是我的Mapper代码:
public class OrikaTransformServiceImpl implements TransformService {
public OrikaTransformServiceImpl() {
MapperFactory mapperFactory = new DefaultMapperFactory.Builder()
//.compilerStrategy(new EclipseJdtCompilerStrategy())
.propertyResolverStrategy(new MyCustomPropertyResolver())
.build();
ConverterFactory converterFactory = mapperFactory.getConverterFactory();
mapperFactory.classMap(ExtractionListItem.class, CompanyData.class)
.field("values['companyNm']", "nombre")
.field("values['companyActvt']", "actividad")
.field("values['contractTp']", "tipoContrato")
.field("values['contractTpOtr']", "tipoContratoOtro")
.field("values['position']", "cargo")
.field("values['annualSalary']", "ingresosAnuales")
.field("values['bonus']", "bonus")
.field("values['startDate']","antiguedadEmpresa")
.field("values['positionDate']","antiguedadCargo")
// 300+ fields
.customize(new CompanyDataCustomMapper(this))
.byDefault()
.mapNulls(true)
.register();
}
public <F, T> T map(F mapFromObject, Class<T> mapToClass) {
T result = null;
try {
result = mapper.map(mapFromObject, mapToClass);
} catch (Exception e) {
log.error("Error while mapping [{}] to [{}]", mapFromObject.getClass().getSimpleName(), mapToClass.getSimpleName());
log.error("Error: [{}]", e.getMessage());
e.printStackTrace();
}
return result;
}
}
我的转换代码:
CompanyData company = this.transformService.map(entityWithMap, CompanyData.class);
例如,如果日期不正确,则map方法将引发MappingException错误,然后整个公司实例为null。
我想单独对待字段映射异常,或者将失败的字段直接设置为null。