Класс данных Kotlin для JSON с пружиной / jackson

Я пытаюсь выставить некоторый класс данных как объекты JSON, но что-то не работает.

У меня есть следующие классы данных:

data class Link( @JsonProperty("rel") @JsonView(View.Bind::class) val rel: String, @JsonProperty("method") @JsonView(View.Bind::class) val method: HttpMethod, @JsonProperty("href") @JsonView(View.Bind::class) val href: String) data class MetaData(val status: HttpStatus) { @JsonView(View.Bind::class) @JsonProperty("status_code") fun getStatusCode(): Int { return status.value() } @JsonView(View.Bind::class) @JsonProperty("status_desc") fun getStatusDesc(): String { return status.name } } data class Payload( @JsonView(View.Bind::class) @JsonProperty("payload") val payload: Any, @JsonProperty("_meta") @JsonView(View.Bind::class) val metaData: MetaData, @JsonProperty("_links") @JsonView(View.Bind::class) val links: List<Link>) 

И по какой-то причине, когда класс Payload является классом JAVA, все работает нормально, но когда он является классом kotlin, в JSON попадает только элемент полезной нагрузки.

Для зависимости я использую:

 <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib</artifactId> <version>1.0.1-1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-kotlin</artifactId> <version>2.7.1-2</version> </dependency> 

Если я изменю «_meta» и «_links» на «meta» и «links», будут отображены элементы «links».

Мне пришлось использовать следующую комбинацию зависимостей

  <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-kotlin</artifactId> <version>2.7.3</version> </dependency> 

Форма обновления jackson-module-kotlin от 2.7.1-2 до 2.7.3 практически не имела никакого различия в этой проблеме, но я был обязан включать jackson-core , jackson-annotations и jackson-databind .

По-видимому, у jsonson jar, включенного в jackson-module-kotlin были некоторые проблемы spring-webmvc которые мешали мне регистрировать модуль kotlin, как показано ниже

 <mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper" ref="kotlinMapper" /> </bean> </mvc:message-converters> </mvc:annotation-driven> <bean id="kotlinMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"> <property name="featuresToEnable"> <array> <util:constant static-field="com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT" /> <util:constant static-field="com.fasterxml.jackson.databind.SerializationFeature.WRITE_EMPTY_JSON_ARRAYS" /> </array> </property> <property name="modulesToInstall" value="com.fasterxml.jackson.module.kotlin.KotlinModule" /> </bean> 

В конце концов, эти _ в @JsonProperty работали отлично.

Основываясь на информации, которую вы JsonProperty value , проблема, похоже, JsonProperty value с использованием _ как JsonProperty value . Возможно, вы заметили, что все ваши свойства для MetaData содержат _ . Попробуйте удалить все подчеркивания и посмотреть. Я надеюсь, вы также зарегистрировали ObjectMapper , например, в своем Application class :

 @Bean open fun objectMapperBuilder(): Jackson2ObjectMapperBuilder = Jackson2ObjectMapperBuilder().modulesToInstall(KotlinModule()) 
Intereting Posts
Можно ли получить строку в выражении лямбда? Связывание модели домена с полями с нулевым значением в ItemViewModel Возможно ли использовать String как PrimaryKey в Android Room Ошибка внедрения Kotlin Не требуется ли в Котлине? Не удается перейти к тегу @sample AAR / JAR не генерируется с помощью Android Studio 3.0 Canary 7 Функция типа Ketlin reified как расширение функции – Вызывается с Java? Котлин «внутренний» модификатор видимости в Android Kotlin: метод не может использоваться с дженериками В чем разница между свойствами и параметрами в Котлине? Выделение синтаксиса Fisheye / Crucible для Kotlin Могу ли я использовать сторонние java-библиотеки (.jar) для разработки Android с Kotlin? Почему моя установка RxJava блокирует мой поток пользовательского интерфейса? Работа с обратным вызовом BluetoothAdapter.startLeScan Kotlin: установка частного булева класса Java через класс Data в Котлине. Почему я не могу это сделать?