ModelMapper - 映射已经存在 - 两种配置

ModelMapper - A mapping already exists - Two configurations

我有两个 class 使用 ModelMapper 将实体转换为 DTO。在每个 class 中,我在 class 的构造函数中对 ModelMapper 进行了配置,以避免将所有关系转换为 DTO 并得到 WhosebugError。

CompanyServiceImpl

private ModelMapper modelMapper;

@Autowired
public CompanyServiceImpl(ModelMapper modelMapper) {
    this.modelMapper = modelMapper;

    modelMapper.addMappings(skipCompanyServiceFieldsMap);
    modelMapper.addMappings(skipCompanyServiceModuleFieldsMap);
}

PropertyMap<CompanyServiceModule, CompanyServiceModuleDTO> skipCompanyServiceModuleFieldsMap = new PropertyMap<CompanyServiceModule, CompanyServiceModuleDTO>() {
    @Override
    protected void configure() {
        // Tells ModelMapper to NOT populate back references
        skip(destination.getCompanyService());
        skip(destination.getServiceModule().getCompanyServiceModules());
        skip(destination.getServiceModule().getService());
        skip(destination.getServiceModule().getServiceModuleLanguages());
        skip(destination.getServiceModule().getServiceModuleMenus());
    }
};

CompanyProfileImpl

private ModelMapper modelMapper;

@Autowired
public CompanyProfileImpl(ModelMapper modelMapper) {
    this.modelMapper = modelMapper;

    modelMapper.addMappings(skipCompanyProfileFieldsMap);
    modelMapper.addMappings(skipCompanyProfileModuleFieldsMap);
    modelMapper.addMappings(skipCompanyProfileServiceModuleFieldsMap);
}

PropertyMap<CompanyServiceModule, CompanyServiceModuleDTO> skipCompanyProfileServiceModuleFieldsMap = new PropertyMap<CompanyServiceModule, CompanyServiceModuleDTO>() {
    @Override
    protected void configure() {
        // Tells ModelMapper to NOT populate back references
        skip(destination.getCompanyProfileModules());
        skip(destination.getServiceModule());
        skip(destination.getCompanyService());
    }
};

当我 运行 应用程序时出现错误:

com.closeupinternational.authorization.dtos.CompanyServiceModuleDTO.setCompanyService() 的映射已经存在。

如何为 ModelMapper 设置两个配置,每个配置都特定于已实现的服务?因为在一种情况下带来一些关系是有意义的,而在另一种情况下则没有。

我将 class 的实例化更改为构造函数,而不是让 Spring 实例化并视为单例。

private ModelMapper modelMapper;

public CompanyProfileImpl() {
    // Necessary to not get in conflict with others
    this.modelMapper = new ModelMapper();

    modelMapper.addMappings(skipCompanyProfileFieldsMap);
    modelMapper.addMappings(skipCompanyProfileModuleFieldsMap);
    modelMapper.addMappings(skipCompanyServiceModuleFieldsMap);
}

我刚刚通过将所有配置移动到 @AppConfig 中的 @Bean 实例解决了这个问题。留下 MyMapper.class 只有 return 的 myMapper.map() 语句。