From 8b688e4e4098d2ef0c27a0a83a96898e1fb4c623 Mon Sep 17 00:00:00 2001 From: mdabrowski-eu <57441874+mdabrowski-eu@users.noreply.github.com> Date: Mon, 10 Apr 2023 07:59:12 +0200 Subject: [PATCH] BAEL-6216 Use Mapper in Another Mapper with Mapstruct and Java (#13802) --- .../java/com/baeldung/dto/ArticleDTO.java | 12 +++++ .../java/com/baeldung/entity/Article.java | 12 +++++ .../com/baeldung/mapper/ArticleMapper.java | 20 ++++++++ .../mapper/ArticleUsingPersonMapper.java | 16 ++++++ .../mapper/ArticleMapperUnitTest.java | 49 +++++++++++++++++++ 5 files changed, 109 insertions(+) create mode 100644 mapstruct/src/main/java/com/baeldung/dto/ArticleDTO.java create mode 100644 mapstruct/src/main/java/com/baeldung/entity/Article.java create mode 100644 mapstruct/src/main/java/com/baeldung/mapper/ArticleMapper.java create mode 100644 mapstruct/src/main/java/com/baeldung/mapper/ArticleUsingPersonMapper.java create mode 100644 mapstruct/src/test/java/com/baeldung/mapper/ArticleMapperUnitTest.java diff --git a/mapstruct/src/main/java/com/baeldung/dto/ArticleDTO.java b/mapstruct/src/main/java/com/baeldung/dto/ArticleDTO.java new file mode 100644 index 0000000000..708167de94 --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/dto/ArticleDTO.java @@ -0,0 +1,12 @@ +package com.baeldung.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ArticleDTO { + private int id; + private String name; + private PersonDTO author; +} diff --git a/mapstruct/src/main/java/com/baeldung/entity/Article.java b/mapstruct/src/main/java/com/baeldung/entity/Article.java new file mode 100644 index 0000000000..4aff8f4166 --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/entity/Article.java @@ -0,0 +1,12 @@ +package com.baeldung.entity; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class Article { + private int id; + private String name; + private Person author; +} diff --git a/mapstruct/src/main/java/com/baeldung/mapper/ArticleMapper.java b/mapstruct/src/main/java/com/baeldung/mapper/ArticleMapper.java new file mode 100644 index 0000000000..b5b47f6b3b --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/mapper/ArticleMapper.java @@ -0,0 +1,20 @@ +package com.baeldung.mapper; + +import com.baeldung.dto.ArticleDTO; +import com.baeldung.dto.PersonDTO; +import com.baeldung.entity.Article; +import com.baeldung.entity.Person; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface ArticleMapper { + + ArticleMapper INSTANCE = Mappers.getMapper(ArticleMapper.class); + + ArticleDTO articleToArticleDto(Article article); + + default PersonDTO personToPersonDto(Person person) { + return Mappers.getMapper(PersonMapper.class).personToPersonDTO(person); + } +} diff --git a/mapstruct/src/main/java/com/baeldung/mapper/ArticleUsingPersonMapper.java b/mapstruct/src/main/java/com/baeldung/mapper/ArticleUsingPersonMapper.java new file mode 100644 index 0000000000..c1ea0797ed --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/mapper/ArticleUsingPersonMapper.java @@ -0,0 +1,16 @@ +package com.baeldung.mapper; + +import com.baeldung.dto.ArticleDTO; +import com.baeldung.dto.PersonDTO; +import com.baeldung.entity.Article; +import com.baeldung.entity.Person; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper(uses = PersonMapper.class) +public interface ArticleUsingPersonMapper { + + ArticleUsingPersonMapper INSTANCE = Mappers.getMapper(ArticleUsingPersonMapper.class); + + ArticleDTO articleToArticleDto(Article article); +} diff --git a/mapstruct/src/test/java/com/baeldung/mapper/ArticleMapperUnitTest.java b/mapstruct/src/test/java/com/baeldung/mapper/ArticleMapperUnitTest.java new file mode 100644 index 0000000000..2470915a01 --- /dev/null +++ b/mapstruct/src/test/java/com/baeldung/mapper/ArticleMapperUnitTest.java @@ -0,0 +1,49 @@ +package com.baeldung.mapper; + +import com.baeldung.dto.ArticleDTO; +import com.baeldung.dto.CarDTO; +import com.baeldung.entity.Article; +import com.baeldung.entity.Car; +import com.baeldung.entity.Person; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class ArticleMapperUnitTest { + + @Test + public void givenArticle_whenMaps_thenProducesCorrectDto() { + + Article entity = new Article(); + entity.setId(1); + entity.setName("Mapstruct Mapping"); + Person author = new Person(); + author.setId("1"); + author.setName("John"); + entity.setAuthor(author); + + ArticleDTO articleDTO = ArticleMapper.INSTANCE.articleToArticleDto(entity); + + assertEquals(articleDTO.getId(), entity.getId()); + assertEquals(articleDTO.getName(), entity.getName()); + assertEquals(articleDTO.getAuthor().getName(), entity.getAuthor().getName()); + } + + @Test + public void givenArticle_whenMapsWithUses_thenProducesCorrectDto() { + + Article entity = new Article(); + entity.setId(1); + entity.setName("Mapstruct Mapping"); + Person author = new Person(); + author.setId("1"); + author.setName("John"); + entity.setAuthor(author); + + ArticleDTO articleDTO = ArticleUsingPersonMapper.INSTANCE.articleToArticleDto(entity); + + assertEquals(articleDTO.getId(), entity.getId()); + assertEquals(articleDTO.getName(), entity.getName()); + assertEquals(articleDTO.getAuthor().getName(), entity.getAuthor().getName()); + } +}