我是来自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
}
}
答案 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
}
}
然后,例如,您可以按以下方式创建此类的实例,其类型为Int
和String
(分别为T1
和T2
)。
val t2 = "t2"
val base = Base<Int, String>(t2)
或者您可以使用任何(或没有)指定的类型将Base
类子类化。
class SubBase(t2: String): Base<Int, String>(t2)