如何在RestController上反序列化嵌套的Kotlin对象?

时间:2019-11-22 14:30:00

标签: java spring spring-boot spring-mvc kotlin

在Spring应用程序的RestController组件中,我具有需要嵌套对象作为参数的函数。

这是代码

@RestController
class AdController {

    @GetMapping(path = ["/hi"])
    fun sayHello(userRequest: UserRequest): String {
        return  "Hello ${userRequest.name} - ${userRequest.nested!!.nestedValue}"
    }
}

data class UserRequest(val name: String, val nested: NestedObject)
data class NestedObject(var nestedValue: String)

客户端调用此API,并将所有参数作为查询字符串传递

curl localhost:8080/hi\?name=Tom&nested.nestedValue=Berlin

Spring应该足够聪明,可以反序列化两个嵌套对象,但是似乎有一些麻烦。因为答案是:

Constructor threw exception; nested exception is java.lang.IllegalArgumentException: Parameter specified as non-null is null

要使其正常工作,我必须放弃使用nice&save Kotlin语法,并使所有内容nullable

class UserRequest {
    var name: String? = null
    var nested: NestedObject? = null
}

class NestedObject {
    var nestedValue: String? = null
}

以这种方式工作,但是我宁愿在模型上具有更明确的可空性。

1 个答案:

答案 0 :(得分:0)

问题是请求方法,在这种情况下使用GET是一种不好的做法,我建议使用带有POST的{​​{1}}方法来反序列化对象

request body