# Kotlin \> Spring Boot \> Using router DSL, POST Method body, unable to convert JSON to POJOs

**URL:** <https://discuss.kotlinlang.org/t/kotlin-spring-boot-using-router-dsl-post-method-body-unable-to-convert-json-to-pojos/17503>\
**Category:** Web Development\
**Created:** [May 5, 2020, 5:56pm UTC](https://discuss.kotlinlang.org/t/kotlin-spring-boot-using-router-dsl-post-method-body-unable-to-convert-json-to-pojos/17503 "2020-05-05T17:56:17Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![cchunduri](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/cchunduri/32/7418_2.png) [@cchunduri](https://discuss.kotlinlang.org/u/cchunduri)\
**Post date:** [May 5, 2020, 5:56pm UTC](https://discuss.kotlinlang.org/t/kotlin-spring-boot-using-router-dsl-post-method-body-unable-to-convert-json-to-pojos/17503/1 "2020-05-05T17:56:17Z")

</div>

I’m trying to build a Petstore Fullstack application using Kotlin Multiplatform. I’m using Spring Router DSL for defining rest endpoints. For the GET method, it worked fine. Then I started working on POST, below is the code I wrote for the POST method

```
   (accept(APPLICATION_JSON) and "/api").nest {
        POST("/newPet") {ok().body(petHandler::newPet)}
    }

```

PetHandler.kt

```
@Component
class PetHandler(val petRepo: PetRepo) {
        fun newPet(request: ServerRequest): Pets {
            val pet = request.body<Pets>()
            return petRepo.save(pet)
       }
}

```

but then, when I hit the POST API i got below exception,

```
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class kotlin.reflect.jvm.internal.ReflectProperties$LazyVal and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: org.kotlinhyd.petstore.routes.PetStoreRouter$apiRouter$1$1$3$1["owner"]->kotlin.reflect.jvm.internal.KClassImpl["data"])
	at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) ~[jackson-databind-2.10.3.jar:2.10.3]
	at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1191) ~[jackson-databind-2.10.3.jar:2.10.3]
	at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:404) ~[jackson-databind-2.10.3.jar:2.10.3]
	at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:71) ~[jackson-databind-2.10.3.jar:2.10.3]
	at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:33) ~[jackson-databind-2.10.3.jar:2.10.3]
	at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727) ~[jackson-databind-2.10.3.jar:2.10.3]
	at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:722) ~[jackson-databind-2.10.3.jar:2.10.3]
	at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:166) ~[jackson-databind-2.10.3.jar:2.10.3]
	at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727) ~[jackson-databind-2.10.3.jar:2.10.3]
	at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:722) ~[jackson-databind-2.10.3.jar:2.10.3]
	at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:166) ~[jackson-databind-2.10.3.jar:2.10.3]
	at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480) ~[jackson-databind-2.10.3.jar:2.10.3]
	at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319) ~[jackson-databind-2.10.3.jar:2.10.3]
	at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1433) ~[jackson-databind-2.10.3.jar:2.10.3]
	at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:921) ~[jackson-databind-2.10.3.jar:2.10.3]
	at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:287) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:104) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.web.servlet.function.DefaultEntityResponseBuilder$DefaultEntityResponse.writeEntityWithMessageConverters(DefaultEntityResponseBuilder.java:308) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.web.servlet.function.DefaultEntityResponseBuilder$DefaultEntityResponse.writeToInternal(DefaultEntityResponseBuilder.java:270) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.web.servlet.function.DefaultServerResponseBuilder$AbstractServerResponse.writeTo(DefaultServerResponseBuilder.java:298) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.web.servlet.function.support.HandlerFunctionAdapter.handle(HandlerFunctionAdapter.java:77) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.33.jar:9.0.33]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1594) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

```

You can find full project configuration in this GitHub repo [Kotlin-Petstore-Project](https://github.com/cchunduri/kotlin-petstore-project)

Here is the JSON request i’m using for calling the api

> ```
> {
> "name": "tom",
> "petType": "Cat",
> "petSubType": "Maine Coon",
> "numberOfPetsAvailable": "2",
> "tags": "friendly",
> "petImageUrl": ""
> }
> 
> ```

Can you please help me to solve this issue.  
Thanks in Advance.

---

<div class="post-metadata">

**Author:** ![alexis.manin](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/alexis.manin/32/8381_2.png) [@alexis.manin](https://discuss.kotlinlang.org/u/alexis.manin)\
**Post date:** [May 6, 2020, 7:10am UTC](https://discuss.kotlinlang.org/t/kotlin-spring-boot-using-router-dsl-post-method-body-unable-to-convert-json-to-pojos/17503/2 "2020-05-06T07:10:31Z")

</div>

Not sure, but maybe you miss [Jackson Kotlin support](https://github.com/FasterXML/jackson-module-kotlin) in your project dependencies ?

In all cases, it looks more like a Jackson / Spring interop problem. Maybe you’ll get more useful insights by asking directly to one of these communities.

---

<div class="post-metadata">

**Author:** ![cchunduri](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/cchunduri/32/7418_2.png) [@cchunduri](https://discuss.kotlinlang.org/u/cchunduri)\
**Post date:** [May 6, 2020, 2:42pm UTC](https://discuss.kotlinlang.org/t/kotlin-spring-boot-using-router-dsl-post-method-body-unable-to-convert-json-to-pojos/17503/3 "2020-05-06T14:42:14Z")

</div>

Thank you very much @alexis.manin, I’ll ask them as well.

---

<div class="post-metadata">

**Author:** ![cchunduri](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/cchunduri/32/7418_2.png) [@cchunduri](https://discuss.kotlinlang.org/u/cchunduri)\
**Post date:** [May 8, 2020, 6:21pm UTC](https://discuss.kotlinlang.org/t/kotlin-spring-boot-using-router-dsl-post-method-body-unable-to-convert-json-to-pojos/17503/4 "2020-05-08T18:21:18Z")

</div>

After trying different methods and debugging into the framework, the solution I found was simple, I just changed the method reference to the normal method call, below is the updated code in the router

```auto
@Bean
fun apiRouter() = router {
        (accept(APPLICATION_JSON) and "/api").nest {
            POST("/newPet") { ok().body(petHandler.newPet(it))}
        }
}

```

Not sure why it solved, but while debugging the framework I found that wrong class resolved as DTO, but when I used regular method call Jackson framework properly converted DTO to JSON.

---

<div class="post-metadata">

**Author:** ![alexis.manin](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/alexis.manin/32/8381_2.png) [@alexis.manin](https://discuss.kotlinlang.org/u/alexis.manin)\
**Post date:** [May 9, 2020, 1:03pm UTC](https://discuss.kotlinlang.org/t/kotlin-spring-boot-using-router-dsl-post-method-body-unable-to-convert-json-to-pojos/17503/5 "2020-05-09T13:03:46Z")

</div>

Sorry, totally missed that in your first post.

Your updated example works properly because you pass the result of `newPet` function as parameter.  
In your original post, you gave a method handle (pointer): `petHandler::newPet`.

It means that `body` function received the definition of a lambda as parameter, and was asking Jackson to serialize the lambda itself, not to call the method and then serialize the result.

---

<div class="post-metadata">

**Author:** ![cchunduri](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/cchunduri/32/7418_2.png) [@cchunduri](https://discuss.kotlinlang.org/u/cchunduri)\
**Post date:** [May 9, 2020, 1:18pm UTC](https://discuss.kotlinlang.org/t/kotlin-spring-boot-using-router-dsl-post-method-body-unable-to-convert-json-to-pojos/17503/6 "2020-05-09T13:18:15Z")

</div>

Understood the Logic @alexis.manin, Thank you for the explanation.
