【问题标题】:MapStruct - mapping method from iterable to non-iterableMapStruct - 从可迭代到不可迭代的映射方法
【发布时间】:2022-10-23 14:49:54
【问题描述】:

几天以来,我一直在使用 MapStruct,但还没有达到我所需要的。

作为 Spring 练习的一部分,我正在编写一个小应用程序,它将显示有关电影的信息(标题、描述、导演等)以及电影类别。 因此,我创建了一个名为 Category 的附加实体,以便(例如管理员)可以添加或删除单个类别名称。

电影实体

public class Movie {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private String content;
    private String director;
    private int year;
    @ManyToMany
    @Column(nullable = false)
    private List<Category> category;
    private LocalDate createdAt;
}

类别实体

public class Category {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String categoryName;
    private LocalDate createdAt;
}

我将它们全部打包到 MapStruct 和 DTO 中。

MovieDTORequest.java

public class MovieDTORequest {
    private String title;
    private String content;
    private String director;
    private List<Category> category;
    private int year;
}

MovieDTOResponse.java

public class MovieDTOResponse {
    private String title;
    private String content;
    private String director;
    private String categoryName; 
    private int year;
    private LocalDate createdAt;
}

MovieMapper.java

@Mapper(componentModel = "spring")
public interface MovieMapper {

    @Mapping(target = "categoryName", source = "category")
    MovieDTOResponse movieToMovieDTO(Movie movie);

    @Mapping(target = "id", source = "title")
    @Mapping(target = "createdAt", constant = "")
    Movie movieRequestToMovie(MovieDTORequest request);

    @Mapping(target = "id", source = "title")
    @Mapping(target = "createdAt", constant = "")
    void updateMovie(MovieDTORequest request, @MappingTarget Movie target);

    String map(List<Category> value);
}

但是,我对 Mapper 有疑问。首先,我得到了错误

"Can't map property "List<Category> category" to "String categoryName". Consider to declare/implement a mapping method: "String map(List<Category> value)"

当我在 Mapper 中编写它时,我还有一个错误

Can't generate mapping method from iterable type from java stdlib to non-iterable type.

我正在寻求帮助,因为我已经迷路了。

【问题讨论】:

    标签: spring dto mapstruct iterable


    【解决方案1】:

    您应该在 MovieMapper 接口内为 String map(List&lt;Category&gt; value) 定义 default 实现 Mapstruct 将使用什么来将属性 List&lt;Category&gt; category 映射到 String categoryName。例如:

    @Mapper(componentModel = "spring")
    public interface MovieMapper {
    
        @Mapping(target = "categoryName", source = "category")
        MovieDTOResponse movieToMovieDTO(Movie movie);
    
        @Mapping(target = "id", source = "title")
        @Mapping(target = "createdAt", constant = "")
        Movie movieRequestToMovie(MovieDTORequest request);
    
        @Mapping(target = "id", source = "title")
        @Mapping(target = "createdAt", constant = "")
        void updateMovie(MovieDTORequest request, @MappingTarget Movie target);
    
        default String map(List<Category> value){
            return value.get(0).getCategoryName();
        }
    

    【讨论】:

      猜你喜欢
      • 2019-08-15
      • 1970-01-01
      • 2017-04-20
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      相关资源
      最近更新 更多