【问题标题】:How to set reference to parent element in the list of child elements when using MapStruct?使用 MapStruct 时如何在子元素列表中设置对父元素的引用?
【发布时间】:2022-01-24 18:12:22
【问题描述】:

我有两节课

@Entity
class Author {
   
   @Id
   private Long id;
   
   private String authorName;
   
   @OneToMany(mappedBy = "author")
   private List<Book> authorBooks;
}

@Entity
class Book {
 
   @Id
   private Long id;
   
   private String bookTitle;
   
   @ManyToOne
   @JoinColumn(name = "id")
   private Author bookAuthor;
}

我需要将传入的请求映射到以下 dto 类:

class AuthorRequest {

  private String authorRequestName;

  private List<String> authorRequestBooks;

}

我已经用 MapStruct 实现了一个简单的 dto 接口

@Mapper
public interface AuthorMapper {

   @Mapping(target = "authorName", source = "request.authorRequestName")
   Author map(AuthorRequest request);

但是,当我还在创建Author 的过程。像这样的

public class AuthorMapperImpl implements AuthorMapper {
   @Override
   public Author map(AuthorRequest request) {

      Author author = new Author();
      author.setAuthorName(request.getAuthorRequestName());
      author.mapBooks(request.getAuthorRequestBooks(), author);

      return author;
   }

   private List<Book> mapBooks(List<String> authorRequestBooks, Author author) {
      List<Book> books = new ArrayList<>();
         for (String title : authorRequestBooks) {
            Book book = new Book();
            book.setBookAuthor(author);
            book.setBookTitle(title);
            books.add(book);
         }
      }
      return books;
   } 

}

是否可以使用 MapStruct?

【问题讨论】:

    标签: java spring mapstruct


    【解决方案1】:

    您可以结合使用生命周期方法、@Context 和自定义映射来实现此目的。

    @Context 将用于跟踪当前映射的作者。

    解决方案可能如下所示:

    public class AuthorMappingContext {
    
    
        protected Author currentAuthor;
    
        @BeforeMapping
        public void startMapping(@MappingTarget Author author) {
            this.currentAuthor = author;
        }
    
        @AfterMapping
        public void afterMapping(@MappingTarget Author author) {
            this.currentAuthor = null;
        }
    
    }
    

    您的映射器将如下所示:

    @Mapper
    public interface AuthorMapper {
    
       @Mapping(target = "authorName", source = "request.authorRequestName")
       @Mapping(target = "authorBooks", source = "authorRequestBooks")
       Author map(AuthorRequest request, @Context AuthorMappingContext context);
    
        default Book mapBook(String bookTitle, @Context AuthorMappingContext context) {
            Book book = new Book();
            book.setBookTitle(bookTitle);
            book.setBookAuthor(context.getCurrentAuthor());
    
            return book;
        }
    }
    

    需要mapBook 方法来告诉 MapStruct 如何从 String 映射到 Book

    【讨论】:

    • 对我不起作用。书籍没有对作者的引用(引用字段为空)
    • 我现在意识到您无法将String 映射到Book。我已经更新了答案以反映这一点。
    • 还是不行。 currentAuthor 字段始终为空
    【解决方案2】:

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2011-12-28
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 2015-10-03
    • 1970-01-01
    相关资源
    最近更新 更多