Я пытаюсь десериализовать несколько полей своего объекта в Spring с помощью аннотации @JsonView. Однако я добавляю аннотацию к своему методу, вместо десериализации указанного поля он возвращает пустой объект.
Вот мой POJO:
@Entity
data class Album(
@JsonView(View.AlbumSummary::class)
val title: String,
@JsonView(View.AlbumSummary::class)
@ManyToMany
val artists: List<Account>,
val dateReleased: LocalDate,
val genre: String = GENRE_NA,
@OneToMany(mappedBy = "album")
val songs: List<Song> = ArrayList(),
val description: String = ""
)
А также метод, реализующий аннотацию @JsonView:
@JsonView(View.AlbumSummary::class)
@RequestMapping("/home-recommendations/{userId}")
fun getHomeRecommendations(@PathVariable userId: String): List<Recommendation> {
val recommendations = ArrayList<Recommendation>()
val user = accountRepository.findById(userId).get()
val followingArtists = user.following.filter {
it.following.isArtist
}
val suggestedArtists = followingArtists.shuffled().take(Random().nextInt(11) + 10)
for (i in 0 until suggestedArtists.size) {
val suggestedArtist = suggestedArtists[i].following
val recommendedAlbums = suggestedArtist.albums.shuffled().take(Random().nextInt(6) + 10)
recommendations.add(Recommendation("Because you listened to ${suggestedArtist.fullName}", Recommendation.TYPE_ALBUM, albums = recommendedAlbums))
}
return recommendations
}
Обновлено: моя конфигурация gradle:
buildscript {
ext {
kotlinVersion = '1.2.50'
springBootVersion = '2.0.3.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}")
classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}")
classpath("org.jetbrains.kotlin:kotlin-noarg:${kotlinVersion}")
}
}
apply plugin: 'kotlin'
apply plugin: 'kotlin-spring'
apply plugin: 'kotlin-jpa'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'com.aceinteract'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
compileKotlin {
kotlinOptions {
freeCompilerArgs = ["-Xjsr305=strict"]
jvmTarget = "1.8"
}
}
compileTestKotlin {
kotlinOptions {
freeCompilerArgs = ["-Xjsr305=strict"]
jvmTarget = "1.8"
}
}
repositories {
mavenCentral()
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-data-rest')
compile('org.springframework.boot:spring-boot-starter-jdbc')
compile('org.springframework.boot:spring-boot-starter-mustache')
compile('org.springframework.boot:spring-boot-starter-web')
compile('com.fasterxml.jackson.module:jackson-module-kotlin')
compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
compile("org.jetbrains.kotlin:kotlin-reflect")
runtime('org.postgresql:postgresql')
testCompile('org.springframework.boot:spring-boot-starter-test')
testCompile('org.springframework.restdocs:spring-restdocs-mockmvc')
}
При необходимости я могу предоставить больше кода. Заранее спасибо.
P.S. Тот же код отлично работает при удалении аннотации @JsonView из метода
Кроме того, я использую IntelliJ Idea
@BrijeshJoshi Нет, я не использую proguard
Можете ли вы добавить сюда свой файл Gradle.
@BrijeshJoshi добавлено
Да позволь мне проверить это
Вы получаете ошибку во время выполнения?
@BrijeshJoshi Нет, я не получаю никаких сообщений об ошибках во время выполнения.
@BrijeshJoshi Нет, я не получаю никаких сообщений об ошибках во время выполнения.
Чем? при компиляции?
Позвольте нам продолжить обсуждение в чате.




Убедитесь, что у вас есть Модуль Джексона для Котлина в пути к классам и вы зарегистрированы в экземпляре ObjectMapper.
Да, у меня есть модуль Джексона для Котлина. Также стоит отметить, что в этом же проекте я использовал другие аннотации Джексона, такие как @JsonIgnoreProperties и @JsonIgnore.
Как сказано в документации FasterXML. При использовании proguard аннотации kotlin.Metadata могут быть удалены, что предотвратит десериализацию. Добавьте правило proguard, чтобы сохранить класс kotlin.Metadata: -keep class kotlin.Metadata { *; }
Попробуйте использовать @field:JsonView(View.AlbumSummary::class)
Спасибо за ответ. Есть идеи, как добавить proguard в мой проект?
В модуле вашего приложения уже будет файл с именем proguard-rules.pro. Это ваш файл Proguard
Я не могу найти ни одного файла proguard-rules в моем приложении или модуле проекта
Создайте файл proguard-rules.pro в модуле вашего приложения. И чем из настройки приложения-> Ароматизаторы-> Файл Proguard выберите созданный вами файл, там он будет чем добавлен в ваш проект
У меня была такая же проблема, и JsonView работал только после того, как я переместил поля из конструктора в тело класса. В этом случае вы не стали бы использовать класс данных, но вы все равно можете делегировать равный хэш-код toString частному внутреннему классу данных.
Вы пользуетесь прогардом?