Сопоставить несколько полей с одним с помощью MapStruct - PullRequest
0 голосов
/ 09 октября 2018

У меня есть эти 3 класса в отдельных файлах

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;

}

У меня есть следующий маппер

@Mapper
public interface BookMapper { 

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

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

}

, это в настоящее время только сопоставляет lastName и работает, и я хочу сопоставить автораСтрока в Книге с

author.firstName + " " author.lastName

как я могу это сделать?Я не смог ничего найти в документации MapStruct.

1 Ответ

0 голосов
/ 09 октября 2018

MapSruct не поддерживает сопоставление нескольких исходных свойств в одно целевое свойство.

У вас есть два способа добиться этого:

Использование Mapping # expression

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

Используя @AfterMapping или @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());
    }

}
...