web-dev-qa-db-fra.com

Mapstruct: ignorer un champ spécifique uniquement pour le mappage de collection

J'utilise le mappeur suivant pour mapper des entités:

public interface AssigmentFileMapper {

AssigmentFileDTO assigmentFileToAssigmentFileDTO(AssigmentFile assigmentFile);

AssigmentFile assigmentFileDTOToAssigmentFile(AssigmentFileDTO assigmentFileDTO);

@Mapping(target = "data", ignore = true)
List<AssigmentFileDTO> assigmentFilesToAssigmentFileDTOs(List<AssigmentFile> assigmentFiles);

List<AssigmentFile> assigmentFileDTOsToAssigmentFiles(List<AssigmentFileDTO> assigmentFileDTOs);
}

Je dois ignorer le champ "données" uniquement pour les entités mappées en tant que collection. Mais ça ressemble à @Mapping ne fonctionne que pour des entités uniques. J'ai également remarqué que la méthode générée assigmentFilesToAssigmentFileDTOs utilise simplement assigmentFileToAssigmentFileDTO dans for-loop. Y a-t-il une solution pour ça?

8
Dmitry Kach

MapStruct utilise l'affectation qu'il peut trouver pour le mappage de collection. Pour obtenir ce que vous voulez, vous devrez définir une méthode personnalisée dans laquelle vous allez ignorer le champ data explicitement, puis utiliser @IterableMapping(qualifiedBy) ou - @IterableMapping(qualifiedByName) pour sélectionner la méthode requise.

Votre mappeur devrait ressembler à:

public interface AssigmentFileMapper {

    AssigmentFileDTO assigmentFileToAssigmentFileDTO(AssigmentFile assigmentFile);

    AssigmentFile assigmentFileDTOToAssigmentFile(AssigmentFileDTO assigmentFileDTO);

    @IterableMapping(qualifiedByName="mapWithoutData")
    List<AssigmentFileDTO> assigmentFilesToAssigmentFileDTOs(List<AssigmentFile> assigmentFiles);

    List<AssigmentFile> assigmentFileDTOsToAssigmentFiles(List<AssigmentFileDTO> assigmentFileDTOs);

    @Named("mapWithoutData")
    @Mapping(target = "data", ignore = true)
    AssignmentFileDto mapWithouData(AssignmentFile source)

}

Tu devrais utiliser org.mapstruct.Named et non javax.inject.Named pour que cela fonctionne. Vous pouvez également définir votre propre annotation en utilisant org.mapstruct.Qualifier

Vous pouvez trouver plus d'informations ici dans la documentation .

16
Filip