如何映射到通用类型?

2023-11-25

PageInfoDto<T>:

public class PageInfoDto<T> {
    private int currentPageNum;
    private int totalPageNum;
    private int perPageNum;
    private int totalItemNum;
    private List<T> list;
}

Page<T>:

public class Page<T> {
    private int current;
    private int total;
    private int size;
    private int items;
    private List<T> list;
}

我有学校名单和学生名单。

我想要地图Page<School> to PageInfoDto<SchoolDto>和地图Page<Student> to PageInfoDto<StudentDto>

这就是我的映射器的样子:

@Mapper(config = CentralConfig.class, uses = {StudentMapper.class, SchoolMapper.class}, componentModel = "spring")
public interface PageInfoMapper {
    @Mappings({
        @Mapping(target = "list", source = "pageInfo.records"),
        @Mapping(target = "currentPageNum", source = "pageInfo.current"),
        @Mapping(target = "totalPageNum", source = "pageInfo.pages"),
        @Mapping(target = "perPageNum", source = "pageInfo.size"),
        @Mapping(target = "totalItemNum", source = "pageInfo.total"),
    })
    PageInfoDto<SchoolDto> toPageInfoDto1(Page<School> pageInfo);

    @Mappings({
        @Mapping(target = "list", source = "pageInfo.records"),
        @Mapping(target = "currentPageNum", source = "pageInfo.current"),
        @Mapping(target = "totalPageNum", source = "pageInfo.pages"),
        @Mapping(target = "perPageNum", source = "pageInfo.size"),
        @Mapping(target = "totalItemNum", source = "pageInfo.total"),
    })
    PageInfoDto<StudentDto> toPageInfoDto2(Page<Student> pageInfo);
}

这显然不是一个聪明的方法,必须重复相同的代码。有一个更好的方法吗?


Mapstruct 是一个代码生成器。因此它需要知道要构造哪些类型才能生成方法实现。话虽如此,您可以通过使用定义所有映射的基本映射方法来更智能地做到这一点@Mapping注释并忽略泛型类型映射。您仍然可以使用上面的方法,但只需指定@InheritConfiguration

或者,您可以考虑使用对象工厂@TargetType构造正确的泛型类型。我不确定这是否适用于通用映射方法签名。我无法检查它,但请告诉我这是否有效

E.g.

    public interface BasePageMapper<S, DTO> {

        @Mapping(target = "list", source = "records"),
        @Mapping(target = "currentPageNum", source = "current"),
        @Mapping(target = "totalPageNum", source = "pages"),
        @Mapping(target = "perPageNum", source = "size"),
        @Mapping(target = "totalItemNum", source = "total"),
        PageInfoDto<DTO> toPageInfoDto(Page<S> pageInfo);

        DTO toDto(S source);
    }

@Mapper( config = CentralConfig.class, uses = StudentMapper.class, componentModel = "spring")
    public interface StudentMapper extends BasePageMapper<Student, StudentDto> {

    }

@Mapper( config = CentralConfig.class, uses = SchoolMapper.class, componentModel = "spring")
    public interface SchoolMapper extends BasePageMapper<School, SchoolDto> {

    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何映射到通用类型? 的相关文章

随机推荐