2017-10-20 1 views
0

Comment puis-je faire le mappage de bean en utilisant MapStruct pour le scénario ci-dessous.Mappage de listes imbriquées à l'aide de MapStruct

class Source { 
private String sourceId; 
private List<Course> courses; //always returns only one course 
} 

class Course { 
private String courseName; 
private List<Student> students; 
} 

class Student { 
private String studentName; 
} 

class Target { 
private String targetId; 
private String subjectName; 
private List<Member> members; 
} 

class Member { 
private String memberName; 
} 

Maintenant, je veux la carte sourceid à targetId, courseName à subjectName, studentName à nomMembre (liste à la liste).

Répondre

1

tout d'abord est Source contient toujours un cours pourquoi ne pas en faire un élément Course au lieu d'un List?

Si vous faites cela, la cartographie serait beaucoup plus simple. Avec votre configuration actuelle, c'est un peu plus complexe.

@Mapper 
public interface MyMapper { 

    @Mapping(target = "targetId", source = "sourceId") 
    @Mapping(target = "subjectName", source = "courses") 
    @Mapping(target = "members", source = "courses") 
    Target map(Source source); 

    default String subjectName(List<Course> courses) { 
     if (courses == null || courses.isEmpty()) { 
      return null; 
     } 
     return courses.get(0).getCourseName(); 
    } 

    default List<Member> toMembersFromCourses(List<Course> courses) { 
     if (courses == null || courses.isEmpty()) { 
      return null; 
     } 
     return toMembers(courses.get(0).getStudents()); 
    } 

    List<Member> toMembers(List<Student> students); 

    @Mapping(target = "memberName", source = "studentName") 
    Member toMember(Student student); 
} 

Si Course n'est pas une liste. alors vous pouvez le faire plus élégant avec 1.2.0.Final.

@Mapper 
public interface MyMapper { 

    @Mapping(target = "targetId", source = "sourceId") 
    @Mapping(target = "subjectName", source = "course.courseName") 
    @Mapping(target = "members", source = "course.students") 
    Target map(Source source); 

    @Mapping(target = "memberName", source = "studentName") 
    Member toMember(Student student); 
} 
+0

Merci pour la réponse détaillée. Pourquoi le cours est la liste? C'est l'exigence. Aussi pouvez-vous mettre à jour la réponse avec le code source correct pour la classe de mappeur. Liste des membres renvoyés à la place de la liste des étudiants pour la première méthode toMembers(). –

+0

Je ne pense pas que je suis. Le code source renvoie une 'Liste ' – Filip

+0

Je reçois des erreurs de temps de compilation avec le code ci-dessus. –