Actualmente estoy tratando de reducir la cantidad de parámetros en los métodos anotados @RequestMapping en una anotación de clase con @RestController usando clases de datos kotlin. Además, no quiero repetirme en múltiples métodos anotados de @RequestMapping que contienen las mismas variables de ruta.
El siguiente código muestra mi enfoque donde /multiple/ABC/true/123 funciona como se esperaba pero /single/ABC/true/123 se queja de que falta un constructor predeterminado.
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)) } }Cuando uso la siguiente definición de clase de datos, obtengo un resultado, pero la instancia ya no es inmutable y es posible que algunos campos no estén actualizados.
data class Params(@PathVariable("param1") var param1: String = "", @PathVariable("param2") var param2: Boolean = false, @PathVariable("param3") var param3: Int = 0)¿Alguien puede ayudarme a hacer que funcione la definición de la primera clase de datos?
Realmente no puede hacer eso ya que Spring no invocará constructores aparte del constructor predeterminado.
Otro problema es que solo puede vincular variables de ruta individuales a objetos, por lo que no puede crear un objeto complejo de esta manera.
Me quedaría con la versión que usa var s ya que funciona correctamente y crearía un objeto inmutable después de recibir la solicitud.
Otra opción es pasar un objeto json como parámetro porque Jackson tiene un soporte más completo para este tipo de deserialización o puede escribir un deserializador a mano.