2017-06-08 1 views
1

Je comprends Mapstruct me permet de définir ma propre logique de cartographe, je fais comme ceci:Mapstruct auto défini mappeur et Generated automatiquement un

@Mapper(componentModel = "spring") 
public abstract class ProjectMapper { 

    public ProjectInfo map(ProjectEntity projectEntity) { 
     ProjectInfo projectInfo = new ProjectInfo(); 
     projectInfo.setName(projectEntity.getName()); 
     projectInfo.setDescription(projectEntity.getDescription()); 

     // Specific logic that forces me to define it myself 
     if (projectEntity.getId() != null) { 
      projectInfo.setId(projectEntity.getId()); 
     } 
     if (projectEntity.getOrganisation() != null) { 
      projectInfo.setOrganisation(projectEntity.getOrganisation().getName()); 
     } 
     return projectInfo; 
    } 
} 

Il fonctionne très bien, mais je veux aussi Mapstruct « s générés les mappeurs, mais ils doivent être définis dans une interface, est-il possible de regrouper ces deux types de mappeurs?

+0

Que voulez-vous signifie par 'mapper MapStruct 'doivent être définis dans une interface? Vous pouvez également définir un thème dans une classe 'abstract',' MapStruct' implémentera toutes les méthodes abstraites. Je ne suis pas sûr que votre logique spécifique ressemble vraiment à cela, mais 'MapStruct' peut générer exactement la même méthode. – Filip

Répondre

0

REMARQUE: non testé. J'ai utilisé la solution suivante une fois dans un projet Spring-Boot en utilisant MapStruct version 1.0.0.Final. Le processus de mappage standard personnalisé est .

Une des façons de personnaliser vos correspondances sont 'AfterMapping' and 'BeforeMapping' hooks:

@Mapper 
public abstract class ProjectMapperExtension { 

    @AfterMapping 
    public void mapProjectEntityToProjectInfo(ProjectEntity projectEntity, @MappingTarget ProjectInfo projectInfo) { 

     if (projectEntity.getId() != null) { 
      projectInfo.setId(projectEntity.getId()); 
     } 

     if (projectEntity.getOrganisation() != null) { 
      projectInfo.setOrganisation(projectEntity.getOrganisation().getName()); 
     } 
    } 
} 

annoter Ensuite, l'interface standard de mappeur avec uses et ne comprennent pas la coutume des champs mis en correspondance à partir du mapping standard:

@Mapper(componentModel = "spring", uses = {ProjectMapperExtension.class}) 
public interface ProjectMapper { 

    @Mapping(target = "id", ignore = true) 
    @Mapping(target = "organisation", ignore = true) 
    ProjectInfo mapProjectEntityToProjectInfo(ProjectEntity projectEntity); 
}