引用泛型类类型中的值和调用方法

时间:2017-11-21 20:10:27

标签: spring spring-mvc kotlin

我是来自C#的Kotlin新手。目前我正在尝试设置一个接受一些可互换的泛型类的类,这个类的内部代码是一个spring服务端点。

我已经开始使用下面的内容了,但是我似乎在语法上遇到了引用请求体的参数以及调用方法的问题,这些类型是通过类构造函数传入的类型。泛型和反射的语法似乎并不是那么直接,我一直在挖掘的大多数Kotlin例子似乎都没有涵盖我想要做的事情(如果可能的话)。 type1的对象实例将通过body参数传入,type2的对象实例应该通过构造函数传入(语法可能不正确)。

计划使用此模板作为模板,根据相同的基本代码设置多个端点,但具有不同的请求和服务类。

非常感谢任何帮助。

import org.springframework.beans.factory.annotation.Autowired
import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestMethod
import javax.validation.Valid

open class Base <T1,T2>(t1: Class<T1>, t2: Class<T2>) {

  @Autowired
  var type1 = t1

  @Autowired
  var type2 = t2

  @ApiOperation(value = "API 1", response = myResponse::class)
  @ApiResponses(value = *arrayOf(
    ApiResponse(code = 200, message = "successful", response = CcdaResponse::class),
    ApiResponse(code = 405, message = "Invalid", response = Void::class)))
  @RequestMapping(
    value = "/myEndPoint",
    produces = arrayOf("application/json"),
    consumes = arrayOf("application/json"),
    method = arrayOf(RequestMethod.POST)
  )

  fun endpoint(
    @ApiParam(value = "Options", required = true)
    @Valid
    @RequestBody
    body: Class<T1>
  ): ResponseEntity<myResponse> {
    val r = myResponse()
    val response: ResponseEntity<myResponse>
    response = ResponseEntity(r, HttpStatus.OK)
    try {

      //payload
      val parameters = Parameters().apply {
        Id1 = type1::body.Id1.get()
        Id2 = type1::body.Id2.get()
        Id3 = type1::body.Id3.get()
        Id4 = type1::body.Id4.get()
        v = type1::body.v.get()
      }
      //Do stuff like calling method in class of type2 passed in
      val d = type2.getViewModel(parameters)

      r.status = "ok"

    } catch (e: Exception) {
      r.message = e.toString()
      r.status = "error"
    } finally {
    }
    return response
  }
}

1 个答案:

答案 0 :(得分:0)

在创建实例时(与Java相同),参数的类型通过类型参数传入。因此,您确实需要传递类型,添加Class参数并不是正确的语法。

我相信这就是你要找的东西(为简洁起见省略了一些代码)。

open class Base<T1, T2> (@Autowired var t2: T2) {

    @Autowired var type1: T1? = null

    fun endpoint(
        @ApiParam(value = "Options", required = true) @Valid @RequestBody
        body: T1
    ): ResponseEntity<MyResponse> {
        type1 = body
    }

}

然后,例如,您可以按以下方式创建此类的实例,其类型为IntString(分别为T1T2)。

val t2 = "t2"
val base = Base<Int, String>(t2)

或者您可以使用任何(或没有)指定的类型将Base类子类化。

class SubBase(t2: String): Base<Int, String>(t2)