代码之家  ›  专栏  ›  技术社区  ›  thomas77

在Kotlin中创建Springs ParameterizeTypeReference的实例

  •  1
  • thomas77  · 技术社区  · 8 年前

    spring-boot-test RestTestTemplate .

    RestTestTemplate测试模板 有一个 exchange 方法需要 ParameterizedTypeReference

    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 on github

    2 回复  |  直到 8 年前
        1
  •  19
  •   Alexey Romanov    8 年前

    虽然使用对象表达式的答案是正确的,并且与在Java中的方法直接等效,但是如果需要很多参数,具体化的类型参数允许您简化它 ParameterizedTypeReference 学生:

    inline fun <reified T> typeReference() = object : ParameterizedTypeReference<T>() {}
    
    // called as
    restTemplate.exchange(requestEntity, typeReference<List<Person>>())
    

    当编译器看到 typeReference<SomeType> object : ParameterizedTypeReference<SomeType>() {} .

        2
  •  6
  •   thomas77    8 年前

    感谢JB Nizet给我指出了正确的文档。

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

    如果我读对了,这就叫对象表达式。