首页 > 解决方案 > 使用 ModelMapper 防止循环引用 - 列表

问题描述

我有一个 Json 错误,因为我的 DTO 彼此保持循环引用。

公司DTO:

@Data
public class CompanyDTO {

    private Long id;
    private String name;
    private List<CompanyCountryDTO> companyCountries;
    //getters and setters
}

公司国家DTO:

@Data
public class CompanyCountryDTO {

    private Long id;
    private LocalDateTime createdAt;
    private CompanyDTO company;
    private CountryDTO country;
    //getters and setters

CompanyService实现将Company列表转换为CompanyDTO列表:

@Override
public List<CompanyDTO> getAllCompaniesWithCountryDTO() {
   List<Company> listCompanies = companyRep.findAll();
   return listCompanies.stream().map(this::convertToDto).collect(Collectors.toList());
}

private CompanyDTO convertToDto(Company company) {
    CompanyDTO companyWithServiceDTO = modelMapper.map(company, CompanyDTO.class);
    return companyWithServiceDTO;
}

我想做这样的事情,但使用 ModelMapper 因为我还有其他循环引用:

listCompanies.stream().forEach(company -> {
    if (!ObjectUtils.isEmpty(company.getCompanyCountries())) {
        company.getCompanyCountries().forEach(companyCountry -> {
           companyCountry.setCompany(null);             
        });
    }
});

由于公司还有另一个 CompanyCountryDTO 列表,如何从 CompanyCountryDTO 中删除公司参考?

标签: javaspring-bootjava-8circular-referencemodelmapper

解决方案


我认为您只需要跳过“反向引用”即可避免循环和无限递归。在这种情况下, 中的company字段CompanyCountryDTO

让它工作配置你ModelMapper喜欢:

modelMapper.addMappings(new PropertyMap<CompanyCountry, CompanyCountryDTO>() {
    @Override
    protected void configure() {
        // Tells ModelMapper to NOT populate company
        skip(destination.getCompany());
    }
});

推荐阅读