在 Kotlin 中创建 Spring 的 ParameterizedTypeReference 实例
Create instance of Spring´s ParameterizedTypeReference in Kotlin
我正在尝试学习 Kotlin,并测试它如何与 spring 引导一起工作。我的应用程序使用 mongo 数据库来存储数据,并且我有一个用于检索数据的 Jersey 资源。我正在使用 spring-boot-test
和 RestTestTemplate
.
对其进行测试
RestTestTemplate
有一个 exchange
方法,它采用 ParameterizedTypeReference
。这个 class 有一个受保护的构造函数。所以我设法从 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}]")
}
}
这是执行此操作的正确(或唯一)方法,还是有更好的方法?
如果有帮助,这里是整个测试的link:testclass on github
感谢 JB Nizet 为我指出了正确的文档。
val responseEntity : ResponseEntity<List<Person>> =
restTemplate.exchange(requestEntity,
object: ParameterizedTypeReference<List<Person>> () {})
如果我没看错,这叫做对象表达式。
虽然使用对象表达式的答案是正确的,并且直接等效于您在 Java 中所做的方式,但如果您需要许多 ParameterizedTypeReference
s,具体化的类型参数允许您简化它:
inline fun <reified T> typeReference() = object : ParameterizedTypeReference<T>() {}
// called as
restTemplate.exchange(requestEntity, typeReference<List<Person>>())
当编译器看到 typeReference<SomeType>
调用时,它被定义替换,因此结果与您编写 object : ParameterizedTypeReference<SomeType>() {}
.
相同
我正在尝试学习 Kotlin,并测试它如何与 spring 引导一起工作。我的应用程序使用 mongo 数据库来存储数据,并且我有一个用于检索数据的 Jersey 资源。我正在使用 spring-boot-test
和 RestTestTemplate
.
RestTestTemplate
有一个 exchange
方法,它采用 ParameterizedTypeReference
。这个 class 有一个受保护的构造函数。所以我设法从 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}]")
}
}
这是执行此操作的正确(或唯一)方法,还是有更好的方法?
如果有帮助,这里是整个测试的link:testclass on github
感谢 JB Nizet 为我指出了正确的文档。
val responseEntity : ResponseEntity<List<Person>> =
restTemplate.exchange(requestEntity,
object: ParameterizedTypeReference<List<Person>> () {})
如果我没看错,这叫做对象表达式。
虽然使用对象表达式的答案是正确的,并且直接等效于您在 Java 中所做的方式,但如果您需要许多 ParameterizedTypeReference
s,具体化的类型参数允许您简化它:
inline fun <reified T> typeReference() = object : ParameterizedTypeReference<T>() {}
// called as
restTemplate.exchange(requestEntity, typeReference<List<Person>>())
当编译器看到 typeReference<SomeType>
调用时,它被定义替换,因此结果与您编写 object : ParameterizedTypeReference<SomeType>() {}
.