【问题标题】:Mapstruct different mappers for the same target class为同一个目标类映射不同的映射器
【发布时间】:2022-10-23 01:17:17
【问题描述】:

我有这个实体:

public class Character {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String image;
    @Column(nullable = false)
    private String name;
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(
        name = "characters_movies",
        joinColumns = @JoinColumn(name = "character"),
        inverseJoinColumns = @JoinColumn(name = "movie")
    )
    private List<Movie> movies;

这个实体的 DTO:

public class CharacterDTO extends AbstractResponse{
    
    private int id;
    private String image;
    private String name;
    private List<MovieDTO> movies;

    public CharacterDTO(String image, String name){
        this.image= image;
        this.name= name;
    }
}

这个映射器:

@Mapper(componentModel = "spring", uses = MovieMapper.class)
public interface CharacterMapper {

    List<CharacterDTO> toCharactersDTO(List<Character> characters);

    @InheritInverseConfiguration(name = "toCharacterDTO")
    Character toCharacter(CharacterDTO characterDTO);

    default CharacterDTO toCharacterDTO(Character character, String o){
        return new CharacterDTO(character.getImage(), character.getName());
    }

    default CharacterDTO toCharacterDTO(Character character){
        return new CharacterDTO(character.getImage(), character.getName(), character.getAge(), character.getWeight(), character.getHistory(), null);
    }
    
}

我有 2 种方法将映射器映射到 DTO,因为在某些情况下我不想显示 id。这种方法有效(如果有更好的方法,我不这样做),但我想指定 toCharactersDTO 以使用具有 2 个参数的方法。知道我能做到吗?

【问题讨论】:

    标签: java mapstruct


    【解决方案1】:

    我认为你可以这样做:

    @Mapper(componentModel = "spring", uses = MovieMapper.class)
    public interface CharacterMapper {
    
        @IterableMapping(qualifiedByName = "toDTO")
        List<CharacterDTO> toCharactersDTO(List<Character> characters);
    
        @InheritInverseConfiguration(name = "toCharacterDTO")
        Character toCharacter(CharacterDTO characterDTO);
    
        // unused parameter "o"
        @Named("toDTO")
        default CharacterDTO toDTO(Character character/*, String o*/){
            return new CharacterDTO(character.getImage(), character.getName());
        }
    
        default CharacterDTO toCharacterDTO(Character character){
            return new CharacterDTO(character.getImage(), character.getName(), character.getAge(), character.getWeight(), character.getHistory(), null);
        }
        
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      • 1970-01-01
      • 2019-02-04
      相关资源
      最近更新 更多