최대 1 분 소요

문제 상황

redis 캐시를 적용중이어서 함수를 호출하고 나면 캐시에 리턴값을 저장하는데 직렬화를, 그 다음부터 호출할 때 캐시에 저장된 정보
를 꺼내는데 역직렬화를 한다. 이 때 호출한 함수에 페이징을 적용해서 Page로 감싼 데이터들이 반환되는 상황이었고 Page 구현체인
PageImpl을 역직렬화하는 과정에서 발생한 문제였다.

SerializationException: Could not read JSON:Cannot construct instance of org.springframework.data.domain.PageImpl (no Creators, like default constructor, exist)

해결 방법

에러를 읽어보면 생성자가 없어서 발생하는 문제라는걸 알 수 있다. 그래서 RestPage 클래스를 선언해서 정의해주고 사용했다.

@JsonIgnoreProperties(ignoreUnknown = true, value = {"pageable"})
public class RestPage<T> extends PageImpl<T> {
    @JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
    public RestPage(@JsonProperty("content") List<T> content,
                    @JsonProperty("number") int page,
                    @JsonProperty("size") int size,
                    @JsonProperty("totalElements") long total) {
        super(content, PageRequest.of(page, size), total);
    }

    public RestPage(Page<T> page) {
        super(page.getContent(), page.getPageable(), page.getTotalElements());
    }
}


아래는 RestPage를 적용했을 때 예시이다. Page 대신에 사용해주면 된다.

//RestPage 적용 예시
public RestPage<ProductDto> findByUserId(Long userId, Pageable pageable) {
  return new RestPage<>(productRepository.findByUserId(userId, pageable));
}

//productRepository.findByUserId() 함수 정보
Page<ProductDto> findByUserId(Long userId, Pageable pageable);
  • 위 에러와 같은 이유로 ProductDto도 생성자를 만들어줘야 함!

카테고리:

업데이트:

댓글남기기