#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);
}