Как я могу получить содержимое страницы в виде списка <AnyDTO>, а не как списокс RestTemplate в Котлине - PullRequest
0 голосов
/ 17 декабря 2018

Интерфейс для контроллера

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>

Я сделал это для проверки правильности содержимого с помощью TestRestTemplate, возвращающего строку JSON, но я хотел бы сделать это следующим образом

Ответы [ 2 ]

0 голосов
/ 16 января 2019

вы можете использовать «ParameterizedTypeReference».Как то так:

val response = restTemplate.exchange("/messages/$username", HttpMethod.GET, null,
        object : ParameterizedTypeReference<List<Message>>() {})
0 голосов
/ 17 декабря 2018

Я не могу говорить о том, в чем здесь конкретная проблема, но обычно я бы не использовал PageImpl для представления своего разбитого на страницы ресурса.Вместо этого вы должны взглянуть на Spring HATEOAS .

Вам нужно будет продлить ResourceSupport:

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

Это обеспечитваш класс со hateoas ссылками.Затем вы можете вызвать restTemplate, принимающий этот тип:

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

И вы можете получить ссылки так:

response.getLink(Link.REL_NEXT)
response.getLink(Link.REL_PREVIOUS)
...