【问题标题】:Prevent circular reference with ModelMapper - List使用 ModelMapper 防止循环引用 - 列表
【发布时间】:2021-03-12 12:06:14
【问题描述】:

我遇到了 Json 错误,因为我的 DTO 彼此保持循环引用。

公司DTO:

@Data
public class CompanyDTO {

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

CompanyCountryDTO:

@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 列表?

【问题讨论】:

    标签: java spring-boot java-8 circular-reference modelmapper


    【解决方案1】:

    http://modelmapper.org/user-manual/configuration/

    首选嵌套属性 |确定隐式映射是否应映射嵌套属性,我们强烈建议您在映射包含循环引用的模型时禁用此选项 |真的

    所以另一个解决方法可能是

    getConfiguration().setPreferNestedProperties(false);
    

    【讨论】:

      【解决方案2】:

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

      要让它工作,请配置您的ModelMapper,例如:

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

      【讨论】:

      • 我不知道如何跳过子列表中的对象。我不知道它只是映射实体。谢谢。
      • 问题是这总是跳过它。即使我们想要不想。如果我只想在映射 CompanyDto 而不是在映射 CompanyCountryDTO 时跳过它怎么办?反之亦然。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      • 1970-01-01
      • 2016-07-13
      相关资源
      最近更新 更多