Использование класса данных Kotlin для группировки переменных пути в аннотированном методе Spring @RequestMapping - PullRequest
0 голосов
/ 30 января 2019

В настоящее время я пытаюсь уменьшить количество параметров для аннотированных методов @RequestMapping в аннотации класса с помощью @RestController с использованием классов данных kotlin.Также я не хочу повторяться для нескольких аннотированных методов @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)

Может кто-нибудьпомогите мне заставить работать первое определение класса данных?

1 Ответ

0 голосов
/ 31 января 2019

Вы не можете этого сделать, поскольку Spring не будет вызывать конструкторы отдельно от конструктора по умолчанию.

Другая проблема заключается в том, что вы можете привязывать только отдельные переменные пути к объектам, поэтому вы не можете создать комплекс.объект таким образом.

Я бы придерживался версии, которая использует var s, так как она работает должным образом и создает неизменный объект после получения запроса.

Другой вариант - передатьjson объект в качестве параметра, потому что Джексон имеет более полную поддержку для такого рода десериализации, или вы можете написать десериализатор вручную.

...