Spring Jackson Databind не работает для моего класса данных Kotlin - PullRequest
1 голос
/ 14 января 2020

При использовании Spring RestTemplate для десериализации некоторого ответа JSON в объект я не могу этого сделать, потому что я использую класс данных Kotlin в качестве моей объектной модели.

Это класс данных:

data class Description (
        val descriptionShort: String,
        val descriptionLong: String,
        val productGroupName: String,
        val shortDescriptionProductGroup: String,
        val descriptionProductGroupMarketing: String
)

Я использую следующие зависимости:

    dependencies {
        implementation("org.springframework.boot:spring-boot-starter-webflux")
        //others
    }

    dependencyManagement {
        imports {
            mavenBom("org.springframework.boot:spring-boot-dependencies:2.2.0.RELEASE")
            //others
        }
        dependencies {
            dependency("org.springframework.cloud:spring-cloud-stream-reactive:2.2.1.RELEASE")
            dependency("com.fasterxml.jackson.module:jackson-module-kotlin:2.10.2")
            //others

        }
    }

Сообщение об ошибке при выполнении модульных тестов, включающих логи RestTemplate c:

Причина: com .faster xml .jackson.databind.ex c .InvalidDefinitionException: Невозможно создать экземпляр com.company.importer.customer.converter.ut.Description (не существует создателей, таких как конструкция по умолчанию): невозможно десериализовать из значения объекта (без создателя на основе делегатов или свойств)

Ответы [ 2 ]

1 голос
/ 14 января 2020

Я столкнулся с подобной проблемой много дней назад; в качестве первого шага я решил проблему, как и в ответе @ xetra11, но мне не очень понравилась идея иметь значения по умолчанию только по техническим причинам.

Наконец я решил свою проблему, просто добавив @RequestBody аннотация к параметру метода контроллера: мой метод теперь выглядит следующим образом:

fun newTransaction(@RequestBody input: NewTxRequest)

NewTxRequest определяется следующим образом

data class NewTxRequest(val from: String, val to: String, val amount: BigDecimal)

и сериализация работает нормально ... Я надеюсь, что это может и тебе в помощь!

1 голос
/ 14 января 2020

Друг сказал мне, что нужен конструктор без аргументов. Это делается в Kotlin, давая каждому свойству значение по умолчанию:

data class Description (
        val descriptionShort: String = "",
        val descriptionLong: String = "",
        val productGroupName: String = "",
        val shortDescriptionProductGroup: String = "",
        val descriptionProductGroupMarketing: String = ""
)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...