当前,我正在尝试使用Kotlin数据类使用@RestController减少类注释中@RequestMapping注释方法上的参数数量。另外,我也不想重复使用多个@RequestMapping注释的方法,这些方法包含相同的路径变量。
以下代码显示了我的方法,其中/multiple/ABC/true/123
可以正常工作,但是/single/ABC/true/123
抱怨缺少默认构造函数。
data class Params(@PathVariable("param1") val param1: String,
@PathVariable("param2") val param2: Boolean,
@PathVariable("param3") val param3: Int)
@RestController
class TestController {
@RequestMapping("/single/{param1}/{param2}/{param3}")
fun single(params: Params) {
println(listOf(params.param1, params.param2, params.param3))
}
@RequestMapping("/multiple/{param1}/{param2}/{param3}")
fun multiple(@PathVariable("param1") param1: String,
@PathVariable("param2") param2: Boolean,
@PathVariable("param3") param3: Int) {
println(listOf(param1, param2, param3))
}
}
当我改用下面的数据类定义时,我得到一个结果,但是实例不再是不可变的,并且可能有些字段没有更新。
data class Params(@PathVariable("param1") var param1: String = "",
@PathVariable("param2") var param2: Boolean = false,
@PathVariable("param3") var param3: Int = 0)
有人可以帮助我使第一个数据类定义生效吗?
答案 0 :(得分:2)
您无法真正做到这一点,因为Spring不会调用默认构造函数以外的构造函数。
另一个问题是,您只能将单个路径变量绑定到对象,因此不能以这种方式创建复杂的对象。
我会坚持使用var
的版本,因为它可以正常工作,并在收到请求后创建一个不可变的对象。
另一种选择是将json对象作为参数传递,因为Jackson对这种反序列化有更全面的支持,或者您可以手动编写反序列化器。