web-dev-qa-db-fra.com

Mappez plusieurs champs en un seul avec MapStruct

J'ai ces 3 classes dans des fichiers séparés

public class Book {

   @Id
    @GeneratedValue
    private Long id;

    @NonNull
    private String title;

    @NonNull
    private Author author;

}

public class Author {

    @Id
    @GeneratedValue
    private Long id;

    @NonNull
    private String firstName;

    @NonNull
    private String lastName;

}

public class BookDTO {

    private Long id;

    @NonNull
    private String title;

    @NonNull
    private String author;

}

J'ai le mappeur suivant

@Mapper
public interface BookMapper { 

    BookMapper INSTANCE = Mappers.getMapper(BookMapper.class);

    @Mappings({
            @Mapping(source = "author.lastName", target = "author")
    })
    BookDTO toDTO(Book book);

}

actuellement, cela ne fait que mapper le nom et fonctionne, et je veux mapper la chaîne d'auteur dans Book avec

author.firstName + " " + author.lastName

comment pourrais-je faire ça? Je n'ai rien trouvé dans la documentation MapStruct.

8
Styl

MapSruct ne prend pas en charge le mappage de plusieurs propriétés source en une seule propriété cible.

Vous avez 2 façons d'y parvenir:

Utilisation de l'expression Mapping #

@Mapping( target = "author", expression = "Java(book.getAuthor().getFirstName() + \" \" + book.getAuthor().getLastName())")

En utilisant @AfterMapping ou @BeforeMapping

@Mapper
public interface BookMapper { 

    BookMapper INSTANCE = Mappers.getMapper(BookMapper.class);


    @Mapping(target = "author", ignore = true)
    BookDTO toDTO(Book book);

    @AfterMapping
    default void setBookAuthor(@MappingTarget BookDTO bookDTO, Book book) {
        Author author = book.getAuthor();
        bookDTO.setAuthor(author.getFirstName() + " " + author.getLastName());
    }

}
17
Filip