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>
映射到 PageInfoDto<SchoolDto>
并将 Page<Student>
映射到 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
来构造正确的泛型类型。我不确定这是否适用于通用映射方法签名。我无法检查它,但请告诉我这是否有效
例如
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> {
}