Десериализовать вложенный объект Kotlin в springMVC - PullRequest
1 голос
/ 10 июля 2020

Я пытаюсь десериализовать сложный запрос GET в структуру вложенных объектов.

Запросы GET выглядят так:

curl 'localhost:8080/?id=1&inner.id=1'

, а код должен выглядеть так:

class RootObj(val id: Int, inner: InnerObject)
class InnerObject(val id: Int)

@RestController
class SearchController {

    @GetMapping(path = ["/"])
    fun getRoot(rootObj: RootObj): String {
        return "ok"
    }
}

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

Parameter specified as non-null is null: [...] parameter inner","path":"/"}%

Есть ли способ решить эту проблему? Может быть, предоставить полностью настраиваемый код десериализатора?

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

1 Ответ

1 голос
/ 10 июля 2020

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

class RootObj(val id: Int = 0, val inner: InnerObject = InnerObject(0))
class InnerObject(var id: Int = 0)

Обратите внимание, что поле id в InnerObject должно быть объявлено как var, чтобы Spring мог его сопоставить. Тогда curl 'localhost:8080/?id=1&inner.id=1' будет работать нормально.

...