Я пытаюсь использовать Kotlin для конечных точек Google Java Cloud, но получаю следующее исключение при десериализации классов данных Kotlin
INFO: exception occurred while calling backend method
com.google.api.server.spi.response.BadRequestException: com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of my.package.Foo: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)
at [Source: UNKNOWN; line: -1, column: -1]
at com.google.api.server.spi.request.RestServletRequestParamReader.read(RestServletRequestParamReader.java:128)
at com.google.api.server.spi.SystemService.invokeServiceMethod(SystemService.java:349)
at com.google.api.server.spi.handlers.EndpointsMethodHandler$RestHandler.handle(EndpointsMethodHandler.java:119)
at com.google.api.server.spi.handlers.EndpointsMethodHandler$RestHandler.handle(EndpointsMethodHandler.java:102)
at com.google.api.server.spi.dispatcher.PathDispatcher.dispatch(PathDispatcher.java:50)
at com.google.api.server.spi.EndpointsServlet.service(EndpointsServlet.java:71)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
...
Мои файлы Kotlin ...
// file: Foo.kt
data class Foo(val bar: String) {
}
// file: MyEndpoint.kt
// My GET works fine as Serialization Does work
@ApiMethod(name = "getFoo",
description = "testing get",
path = "getFoo",
httpMethod = ApiMethod.HttpMethod.GET)
fun getFoo(): Foo {
val myFoo = Foo("myBar")
return myFoo
}
// My Post doesn't work, de-serialization is broken
@ApiMethod(name = "postFoo",
description = "testing post",
path = "postFoo",
httpMethod = ApiMethod.HttpMethod.POST)
fun postFoo(myFoo: Foo): Foo {
val postFoo = Foo(myFoo.bar)
return postFoo
}
Я вижу, что мне нужно добавить KotlinModule в Jackson ObjectMapper
// file: build.gradle
compile("com.fasterxml.jackson.module:jackson-module-kotlin:2.8.4")
// adding this will fix the problem, but Where??
objectMapper.registerModule(new KotlinModule());
Где я могу манипулировать «глобальным» ObjectMapper для конечных точек Java?
Я вижу, что могу добавить Transformer либо в @Api, либо в сами классы данных.
Если я добавлю его в @Api, я не получу никакой информации о типе, так что это не так
Добавление его к классам данных требует от меня создания другого класса данных Transformer for Every. Который
кажется, что это сработает, но добавляет много разума.
Есть ли элегантное решение для установки / изменения ObjectMapper по умолчанию?