Создать экземпляр Spring ParameterizedTypeReference в Kotlin - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь изучить Kotlin и проверить, как он работает с весенней загрузкой.Мое приложение использует базу данных Монго для хранения данных, и у меня есть ресурс Джерси для получения данных.Я тестирую его, используя spring-boot-test и RestTestTemplate.

. RestTestTemplate имеет метод exchange, который принимает ParameterizedTypeReference.Этот класс имеет защищенный конструктор.Таким образом, единственный способ использовать его из Kotlin был следующим:

class ListOfPeople : ParameterizedTypeReference<List<Person>>()

Вот мой метод испытаний:

@Test
fun `get list of people`() {
    // create testdata
    datastore.save(Person(firstname = "test1", lastname = "lastname1"))
    datastore.save(Person(firstname = "test2", lastname = "lastname2"))
    datastore.save(Person(firstname = "test3", lastname = "lastname2"))
    datastore.save(Person(firstname = "test4", lastname = "lastname2"))

    val requestEntity = RequestEntity<Any>(HttpMethod.GET, URI.create("/person"))

    // create typereference for response de-serialization
    class ListOfPeople : ParameterizedTypeReference<List<Person>>() // can this be done inline in the exchange method?
    val responseEntity : ResponseEntity<List<Person>> = restTemplate.exchange(requestEntity, ListOfPeople())

    assertNotNull(responseEntity)
    assertEquals(200, responseEntity.statusCodeValue)
    assertTrue( responseEntity.body.size >= 4 )

    responseEntity.body.forEach { person ->
        println("Found person: [${person.firstname} ${person.lastname}] " +
                ", born [${person.birthdate}]")
    }
}

Это правильный(или единственный) способ сделать это, или есть лучший способ?

Если это поможет, вот ссылка на весь тест: testclass на github

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Хотя ответ с использованием объектного выражения является правильным и прямым эквивалентом того, как вы делаете это в Java, параметры типа reified позволяют упростить его, если вам нужно много ParameterizedTypeReference s:

inline fun <reified T> typeReference() = object : ParameterizedTypeReference<T>() {}

// called as
restTemplate.exchange(requestEntity, typeReference<List<Person>>())

Когда компилятор видит вызов typeReference<SomeType>, он заменяется определением, поэтому результат такой же, как если бы вы написали object : ParameterizedTypeReference<SomeType>() {}.

0 голосов
/ 30 сентября 2018

Спасибо JB Nizet, который указал мне на правильную документацию.

val responseEntity : ResponseEntity<List<Person>> =
            restTemplate.exchange(requestEntity, 
            object: ParameterizedTypeReference<List<Person>> () {})

Если я правильно прочитал, это называется выражением Object.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...