Ktorm-enheder som springboot-controllerparametre
Jeg forsøger at bruge Ktorm i min nye springboot-applikation og får mig selv i problemer, når jeg prøver at bruge Ktorm-entitetsgrænseflader som springboot-controllerparametre.
Enheden og controlleren ser sådan ud:
// Controller definition @RestController class TaskController() { @PostMapping fun addTask( @RequestBody task: Task ): Long { // ... do something with `task` } } // Entity definition (unncessary properties are omitted) interface Task : Entity<Task> { var id: Long var title: String var content: String companion object : Entity.Factory<Task>() }
Jeg fik denne undtagelse, når jeg kaldte funktionen addTask()
:
[HttpMessageConversionException] Typedefinitionsfejl:[simpel type, klasse website.smsqo.entity.Task]; indlejret undtagelse er:
[com.fasterxml.jackson.databind.exc.InvalidDefinitionException] Kan ikke konstruere forekomst af website.smsqo.entity.Task
(ingen skabere, som standardkonstruktør, findes):
abstrakte typer skal enten kortlægges til konkrete typer, have tilpasset deserializer eller indeholde yderligere typeinformationer på [Kilde:(PushbackInputStream); linje:1, kolonne:1]”}
(Parameter task
er indsendt fra frontend af RequestBody)
Jeg tror måske, at årsagen er, at springboot som interface ikke kan finde en ordentlig måde at initialisere Task
på . Men at omstrukturere det til dette er bestemt ikke en elegant løsning:
@RestController class TaskController() { @PostMapping fun addTask( id: Long, title: String, content: String // even more fields... ): Long { val task = Task { this.id = id this.title = title this.content = content } // ... do something with `task` } }
Nogen bedre løsning foreslået? På forhånd tak for dit svar!
Svar
Nå, det viser sig, at løsningen blev noteret eksplicit i dokumenter leveret af Ktorm:
// extracted from org.ktorm.entity.Entity /* * Besides of JDK serialization, the ktorm-jackson module also supports serializing entities in JSON format. This * module provides an extension for Jackson, the famous JSON framework in Java word. It supports serializing entity * objects into JSON format and parsing JSONs as entity objects. More details can be found in its documentation. */
Implementering af org.ktorm:ktorm-jackson:3.4.1
bringer os et Jackson-modul med navnet KtormModule
i pakken org.ktorm.jackson
. Det næste, vi skal gøre, er at anvende modulet til vores springboot-applikation som i klassen kommenteret af @Configuration:
@Configuration class KtormConfig { @Bean fun ktormJacksonModule(): Module = KtormModule() // ... and other configurations if you like }
Og det er det. Sådanne KtormModule vil blive opdaget og anvendt af jackson ved springboot-applikationslanceringer, hvorefter der ikke længere er problemer med kodning og afkodning mellem json og Ktorm Entities.