Игнорировать конкретные свойства объекта в списке

#java #spring-boot #mapstruct

Вопрос:

У меня есть эти предметы:

Класс домена

 public class Partecipation implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
...
    @OneToMany(mappedBy = "partecipation")
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    private Set<DesignatedCompany> designatedCompanies = new HashSet<>();
...
}
 

Мой технический директор

 public class PartecipationDTO implements Serializable { 
    private Long id;
...
    private Set<DesignatedCompanyDTO> designatedCompanies = new HashSet<>();
...
}
 

Подключенный DTO

 public class DesignatedCompanyDTO implements Serializable {
    private Long id;
...
    private PartecipationDTO partecipation;
...
}
 

И у меня есть этот картограф:

 public interface PartecipationMapper extends EntityMapper<PartecipationDTO, Partecipation> {
...
    PartecipationDTO toDto(Partecipation partecipation);
}
 

Правильно код выходит с ошибкой, потому что он вводит циклическое условие, и в деталях здесь:

 public class PartecipationMapperImpl implements PartecipationMapper {
...
    protected DesignatedCompanyDTO designatedCompanyToDesignatedCompanyDTO(DesignatedCompany designatedCompany) {
        if ( designatedCompany == null ) {
            return null;
        }

        DesignatedCompanyDTO designatedCompanyDTO = new DesignatedCompanyDTO();

        designatedCompanyDTO.setId( designatedCompany.getId() );
        designatedCompanyDTO.setCompanyEopooCode( designatedCompany.getCompanyEopooCode() );
        designatedCompanyDTO.setNote( designatedCompany.getNote() );
        designatedCompanyDTO.setPartecipation( toDto( designatedCompany.getPartecipation() ) ); // <--- this line cause the error

        return designatedCompanyDTO;
    }
...
}
 

Можно ли установить в картографе исключение для свойства дочернего объекта в списках? Например, вот так:

 @Mapping(target = "designatedCompanies[].partecipation", ignore = true)
 

Ответ №1:

я решил проблему, ткс к филифру (https://github.com/mapstruct/mapstruct/issues/933#issuecomment-265952166)

работая в картографах 2 DTO, вот код:

 @Mapper(componentModel = "spring", uses = {DesignatedCompanyMapper.class})
public interface PartecipationMapper extends EntityMapper<PartecipationDTO, Partecipation> {
...
    @Mapping(target = "designatedCompanies", qualifiedByName="NoPartecipation")
    PartecipationDTO toDto(Partecipation partecipation);
...
}
 

И отображатель повторяющегося объекта

 public interface DesignatedCompanyMapper extends EntityMapper<DesignatedCompanyDTO, DesignatedCompany> {
    @Mapping(source = "partecipation.id", target = "partecipationId")
    DesignatedCompanyDTO toDto(DesignatedCompany designatedCompany);
...
    @Named("NoPartecipation")
    @Mapping(source = "partecipation.id", target = "partecipationId")
    @Mapping(target = "partecipation", ignore = true)
    DesignatedCompanyDTO toDtoNoPartecipation(DesignatedCompany designatedCompany);
}