Java >> Java tutorial >  >> Tag >> Spring

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.


Java tag