graphql-java-tools icon indicating copy to clipboard operation
graphql-java-tools copied to clipboard

ResolverError when using @Cacheable

Open JoniDS opened this issue 7 years ago • 0 comments

I am unable to use @Caching with GraphQL on Spring Boot 2. It works fines when cache hasn't been created, but when cache exists and I request it, I get this error:

com.coxautodev.graphql.tools.ResolverError: Expected source object to be an instance of 'com.xpt.frf.model.Entry' but instead got 'com.xpt.frf.model.Entry' at com.coxautodev.graphql.tools.FieldResolver$getSourceResolver$2.invoke(FieldResolver.kt:27) ~[graphql-java-tools-5.3.3.jar:na] at com.coxautodev.graphql.tools.FieldResolver$getSourceResolver$2.invoke(FieldResolver.kt:10) ~[graphql-java-tools-5.3.3.jar:na] at com.coxautodev.graphql.tools.MethodFieldResolverDataFetcher.get(MethodFieldResolver.kt:150) ~[graphql-java-tools-5.3.3.jar:na]

My service is as follows:

 @Cacheable("entries")
    override fun findAll(pageable: Pageable): Page<Entry> {
        return entryRepository.findAll(pageable)
    }

Schema:

type EntryPagedResponse implements PagedResult {
    content: [Entry]
    totalPages: Int
    totalElements: Int
    page: Int
    itemsPerPage: Int
}

interface PagedResult{
    totalPages: Int
    totalElements: Int
    page: Int
    itemsPerPage: Int
}

type Query {
    #List all available entries
    entries(
    page: Int, limit: Int,
    sort: Sort
): EntryPagedResponse
@Component
class EntriesResolver : GraphQLQueryResolver {

    @Autowired
    lateinit var entryService: EntryService

    fun entries(page: Int?, limit: Int?, sort: com.xpt.frf.model.Sort?, env: DataFetchingEnvironment): EntryPagedResponse {
       
        val pageable = if (sort != null) PageRequest.of(page ?: 0, limit
                ?: 20, Sort.by(if (sort.desc) Sort.Direction.DESC else Sort.Direction.ASC, sort.field))
        else PageRequest.of(page ?: 0, limit ?: 20)
        val results = entryService.findAll(pageable)
        return EntryPagedResponse(results.content, pageable.pageNumber, pageable.pageSize, results.totalPages, results.totalElements)
    }
}
open class EntryPagedResponse(content: List<Entry>, page: Int, itemsPerPage: Int, totalPages: Int?, totalElements: Long?) :
        PagedResponse<List<Entry>>(content, page, itemsPerPage, totalPages, totalElements)

open class PagedResponse<out T>(val content: T?, val page: Int, val itemsPerPage: Int, val totalPages: Int?, val totalElements: Long?) : Serializable

It works fine without the @Cacheable annotation.

Anyone knows how to fix this error? Many thanks

JoniDS avatar Oct 07 '18 21:10 JoniDS