Spring Boot serializa text / javascript a JSON

Creé la siguiente class de datos de Kotlin:

@JsonInclude(JsonInclude.Include.NON_NULL) public data class ITunesArtist(val artistName: String, val artistId: Long, val artistLinkUrl: URL) 

(una class de datos es una class Kotlin que autogenera iguales, hashcode, toString, etc. en time de compilation, ahorra time).

Ahora he intentado RestTemplate usando Spring RestTemplate :

 @Test fun loadArtist() { val restTemplate = RestTemplate() val artist = restTemplate.getForObject( "https://itunes.apple.com/search?term=howlin+wolf&entity=allArtist&limit=1", ITunesQueryResults::class.java); println("Got artist: $artist") } 

Falla con:

 Could not extract response: no suitable HttpMessageConverter found for response type [class vampr.api.service.authorization.facebook.ITunesArtist] and content type [text/javascript;charset=utf-8] 

Justo lo suficiente – el mapeador de objects JSON probablemente esperaba tipo mime de text/json . Aparte de decirle RestTemplate para mapear a String::class.java , y luego instanciar una instancia de JacksonObjectMapper a mano, ¿hay alguna manera de decirle a mi RestTemplate que trate el tipo de mime devuelto como JSON?

    En lugar de proporcionar valores pnetworkingeterminados para todas las properties en su class de datos, también puede usar esto: https://github.com/FasterXML/jackson-module-kotlin

    Este module de Jackson le permitirá serializar y deserializar las classs de datos de Kotlin sin tener que preocuparse de proporcionar un constructor vacío.

    En una aplicación de arranque de spring, puede registrar el module con una class @Configuration , como @Configuration :

     @Configuration class KotlinModuleConfiguration { @Bean fun kotlinModule(): KotlinModule { return KotlinModule() } } 

    Aparte de eso, también puede usar las funciones de extensión mencionadas en la documentation para registrar el module con Jackson.

    Además de admitir classs de datos, también recibirá soporte para varias classs de Kotlin stdlib, como Pair por ejemplo.

    No estoy seguro acerca de Spring, pero Jackson necesitaba que especificara que trabajé con Java Bean. Verá, data class Kotlin es exactamente la misma que un Bean estándar en el nivel de código de bytes.

    No olvide que la especificación Java Bean implica un constructor vacío (sin parameters). Una buena manera de que se genere automáticamente es proporcionar valores pnetworkingeterminados para todos los parameters de tu constructor principal.

    Para serializar un object de Jackson a String:

    • La porción 'get' de la especificación Java Beans es obligatoria.

    Para leer una cadena JSON al object:

    • La porción 'set' de la especificación es obligatoria.
    • Además, el object requiere un constructor vacío.

    Modificar la class para include:

     @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) data public class ITunesArtist(var artistName: String? = null, var artistId: Long = -1L, val amgArtistId: String = "id", var artistLinkUrl: URL? = null) 
    • Los campos proporcionan los valores pnetworkingeterminados para que haya un constructor vacío.

    Editar:

    Utiliza el Módulo Kotlin de la respuesta de @ mhlz (ahora aceptada) que elimina la necesidad de proporcionar un constructor pnetworkingeterminado.