ModelMapper - Converter / AbstractConverter vs Provider

时间:2018-02-05 17:51:11

标签: java converter modelmapper

我正在使用ModelMapper将一些对象转换为复杂的DTO,反之亦然。

尽管我试图理解文档,但我发现很难理解何时使用Converter或Provider或AbstractConverter。

现在,例如,如果我想将String属性转换为目标DTO内的小DTO,我是在抽象转换器中手动完成的。

例如:

dest.setAddressDTO(new AddressDTO(source.getStreet(), source.getNumber()));

虽然这是正确的方法吗? 我什么时候应该使用提供者?

如果我想用条件设置属性,我可以在转换器中使用Conditional,还是仅在使用PropertyMap时使用?

此外,使用相同的modelMap实例转换几种不同类型的对象是一种好习惯吗?

提前致谢

1 个答案:

答案 0 :(得分:0)

使用此方法的正确方法是使用Converters。

例如,假设我要创建一个将dto转换为域对象的转换器。

因此,首先定义一个转换器:

private Converter companyDtoToCompany = new AbstractConverter<CompanyDto, Company>() {
    @Override
    protected Company convert(CompanyDto source) {
        Company dest = new Company();

        dest.setName(source.getName());
        dest.setAddress(source.getAddress());
        dest.setContactName(source.getContactName());
        dest.setContactEmail(source.getContactEmail());
     (...)
        dest.setStatus(source.getStatus());

        return dest;
    }
};

然后将其添加到configureMappings()方法的映射器中:

    modelMapper = new ModelMapper();

    // Using STRICT mode to prevent strange entities mappin

    modelMapper.getConfiguration()
                     .setMatchingStrategy(MatchingStrategies.STRICT);

    modelMapper.addConverter(companyDtoToCompany);
    // modelMapper.addConverter(otherConverter);
}

最后,您只需要添加可从代码中使用的那些类型的映射方法:

public Company convertCompanyReqDtoToCompany(CompanyDto dto, Class<Company> destinationType) {
        return modelMapper.map(dto, destinationType);
    }