如何在Kotlin中使用RestTemplate以List <anydto>而不是以List <java.util.linkedhashmap>的形式获取Page的内容

时间:2018-12-17 15:15:47

标签: spring-boot kotlin resttemplate

控制器接口

interface BrandController {
    fun findDTOs(pageable: Pageable): ResponseEntity<Page<SomeDTO>>
}

简化了我的考试

var response: ResponseEntity<*>

@Test
fun `test`() {
    `given TestRestTemplate`() 
    `when findDTOs`()
    `then check body`()
}

protected fun `given not authorization`() {
    restTemplate = TestRestTemplate()
}

private fun `when findDTOs`() {
    // RestResponsePage<T> extends PageImpl<T>
    response = restTemplate.getForEntity<RestResponsePage<SomeDTO>>(createUrlWithParams(url, requestPage))
}

private fun `then check body`() {
    val body: Page<SomeDTO> = response.body as Page<SomeDTO> // body: "Page 2 of 2 containing java.util.LinkedHashMap instances"

    assertEquals(requestPage.size, body.size) // success

    val content: List<SomeDTO> = body.content as List<SomeDTO> // content: size = 10 body: "Page 2 of 2 containing java.util.LinkedHashMap instances"

    content.forEachIndexed { index, someDTO: SomeDTO-> //Error
        assertEquals(expectedList[index].name, someDTO.name)
        assertEquals(expectedList[index].id, someDTO.id)
    }
}

错误是:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com....SomeDTO

我如何以List<AnyDTO>而不是List<java.util.LinkedHashMap>的形式获取Page的内容

我通过TestRestTemplate返回JSON字符串来验证内容的正确性,但我想以此方式

2 个答案:

答案 0 :(得分:0)

我不能说这里有什么特殊问题,但是通常我不会使用cf_scripts来代表我的分页资源。您应该改为查看Spring HATEOAS

您需要做的是扩展ResourceSupport

PageImpl

这将为您的班级提供hateoas链接。然后,您可以调用restTemplate接受此类型:

class PaginatedRestResponse(val dtos: List<AnyDTO>) : ResourceSupport()

您可以这样检索链接:

response = restTemplate.getForEntity<PaginatedRestResponse>(createUrlWithParams(url, requestPage))

答案 1 :(得分:0)

您可以使用“ ParameterizedTypeReference”。像这样:

val response = restTemplate.exchange("/messages/$username", HttpMethod.GET, null,
        object : ParameterizedTypeReference<List<Message>>() {})