<T> PageResponse<T> fromPage(Page<T> page);
MapStruct 입장에서 보면 T가 무엇인지 모르는 상태이다.
컴파일 시점에서 Page<T> -> PageResponse<T> T가 어떤 타입인지 확정되지 않는다.
그래서 어떤 타입으로 매핑코드를 생성해야될지 몰라서 이런 error가 생긴다.
Can't generate mapping method for a generic type variable source
PageResponse<UserDto> fromPage(Page<UserDto> page);
PageResponse<MessageDto> fromPage(Page<MessageDto> page);
이런 구체 타입은 가능하다.
[해결방법 3가지]
1.자바 클래스 사용
public class PageResponseMapper {
public static <T> PageResponse<T> fromPage(Page<T> page) {
return new PageResponse<>(
page.getContent(),
page.getNumber() + 1,
page.getSize(),
page.hasNext(),
page.getTotalElements()
);
}
}
2.인터페이스 + default 메서드
public interface PageResponseMapper {
default <T> PageResponse<T> fromPage(Page<T> page) {
return new PageResponse<>(
page.getContent(),
page.getNumber(),
page.getSize(),
page.getTotalElements(),
page.getTotalPages(),
page.isFirst(),
page.isLast()
);
}
default <T> PageResponse<T> fromSlice(Slice<T> slice) {
return new PageResponse<>(
slice.getContent(),
slice.getNumber(),
slice.getSize(),
slice.hasNext(),
slice.isFirst(),
slice.isLast()
);
}
}
3.추상 클래스 방식
package com.sprint.mission.discodeit.mapper;
import com.sprint.mission.discodeit.dto.response.PageResponse;
import org.mapstruct.Mapper;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Slice;
@Mapper(componentModel = "spring")
public abstract class PageResponseMapper {
public <T> PageResponse<T> fromPage(Page<T> page) {
return new PageResponse<>(
page.getContent(),
page.getNumber() + 1,
page.getSize(),
page.hasNext(),
page.getTotalElements()
);
}
public <T> PageResponse<T> fromSlice(Slice<T> slice) {
return new PageResponse<>(
slice.getContent(),
slice.getNumber() + 1,
slice.getSize(),
slice.hasNext(),
null
);
}
}'코드잇 스프린트 > 실습' 카테고리의 다른 글
| 디스코드 프로젝트 실습: JPA N+1 문제 해결하기 (0) | 2026.03.11 |
|---|---|
| 디스코드 프로젝트 실습: JPA Public 채널생성시 ReadStatus에 채널id가 null값으로 들어간다. (0) | 2026.03.10 |
| BinaryContent 저장로직 고도화 (0) | 2026.03.09 |
| MapStruct 라이브러리를 통해 Entity를 DTO로 자동 변환 (0) | 2026.03.09 |
| Entity를 Controller까지 그대로 노출 할때 발생할 수 있는 문제점 (0) | 2026.03.09 |