Jackeroo
Jackeroo

Reputation: 95

Mapstruct cannot support Generic type

I want to convert IPage from mybatis-plus to PageDto using mapstruct.

But mapstruct complains: Can't generate mapping method for a generic type variable source。

The code is as follows:

@Mapper
public interface PageDtoMapper<T> {

    @Mapping(source = "total", target = "total")
    @Mapping(source = "pages", target = "pages")
    @Mapping(source = "records", target = "records")
    @Mapping(source = "current", target = "pageNum")
    @Mapping(source = "size", target = "pageSize")
    PageDto<T> toPageDto(IPage<T> page);
}

or:

@Mapper
public interface PageDtoMapper {

    @Mapping(source = "total", target = "total")
    @Mapping(source = "pages", target = "pages")
    @Mapping(source = "records", target = "records")
    @Mapping(source = "current", target = "pageNum")
    @Mapping(source = "size", target = "pageSize")
    <T> PageDto<T> toPageDto(IPage<T> page);
}

PageDTO:

public class PageDto<T extends Serializable> {
    private Long total;
    private Long pages;
    private Long pageNum;
    private Long pageSize;
    private List<T> records;
}

IPage

Can I use generic type in Mapstruct?

Upvotes: 1

Views: 5183

Answers (1)

nquincampoix
nquincampoix

Reputation: 550

Mapstruct generates type-safe code. I think it cannot be achieved if there is a type parameter left in the mapper interface.

Even if it forces you to define as many mapping methods as record types you use, this should work :

@Mapper
public interface PageDtoMapper {

    @Mapping(source = "total", target = "total")
    @Mapping(source = "pages", target = "pages")
    @Mapping(source = "records", target = "records")
    @Mapping(source = "current", target = "pageNum")
    @Mapping(source = "size", target = "pageSize")
    PageDto<RecordType> toPageDto(IPage<RecordType> page);
}

Upvotes: 1

Related Questions