Как добавить поддержку Kotlin для конечных точек Google Java Cloud - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь использовать 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 по умолчанию?

...