【问题标题】:ModelMapper - Converter/ AbstractConverter vs ProviderModelMapper - 转换器/ AbstractConverter vs Provider
【发布时间】:2018-02-05 17:51:11
【问题描述】:

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

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

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

例如:

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

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

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

另外,使用同一个modelMapper实例来转换几种不同类型的对象是不是一个好习惯?

提前致谢

【问题讨论】:

    标签: java converter modelmapper


    【解决方案1】:

    处理这个问题的正确方法是使用转换器。

    例如,假设我想创建一个转换器来将 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);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-22
      • 2021-08-28
      • 2017-06-03
      • 1970-01-01
      相关资源
      最近更新 更多