gpt4 book ai didi

mapstruct - 如何映射到泛型类型?

转载 作者:行者123 更新时间:2023-12-04 02:45:44 27 4
gpt4 key购买 nike

页面信息

public class PageInfoDto<T> implements Serializable {

private int currentPageNum;

private int totalPageNum;

private int perPageNum;

private int totalItemNum;

private List<T> list;

}



public class Page<T> implements Serializable {

private int current;

private int total;

private int size;

private int items;

private List<T> list;

}


比如说,我有一个学校名单和一个学生名单。

我想将 Page 映射到 PageInfoDto 并将 Page 映射到 PageInfoDto。

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

@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 来处理对象工厂。构造适当的泛型类型。我不确定这是否适用于通用映射方法签名。我无法检查它,但请告诉我它是否有效

例如。

    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> {

}

关于mapstruct - 如何映射到泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57351869/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com