Аннотации @JsonView не работают

Я пытаюсь десериализовать несколько полей своего объекта в 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

Вы пользуетесь прогардом?

Brijesh Joshi 04.07.2018 07:49

@BrijeshJoshi Нет, я не использую proguard

Ace Falobi 04.07.2018 12:53

Можете ли вы добавить сюда свой файл Gradle.

Brijesh Joshi 04.07.2018 12:55

@BrijeshJoshi добавлено

Ace Falobi 04.07.2018 13:01

Да позволь мне проверить это

Brijesh Joshi 04.07.2018 13:02

Вы получаете ошибку во время выполнения?

Brijesh Joshi 04.07.2018 13:03

@BrijeshJoshi Нет, я не получаю никаких сообщений об ошибках во время выполнения.

Ace Falobi 04.07.2018 13:05

@BrijeshJoshi Нет, я не получаю никаких сообщений об ошибках во время выполнения.

Ace Falobi 04.07.2018 13:06

Чем? при компиляции?

Brijesh Joshi 04.07.2018 13:06

Позвольте нам продолжить обсуждение в чате.

Ace Falobi 04.07.2018 13:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
10
718
3

Ответы 3

Убедитесь, что у вас есть Модуль Джексона для Котлина в пути к классам и вы зарегистрированы в экземпляре ObjectMapper.

Да, у меня есть модуль Джексона для Котлина. Также стоит отметить, что в этом же проекте я использовал другие аннотации Джексона, такие как @JsonIgnoreProperties и @JsonIgnore.

Ace Falobi 04.07.2018 13:01
  1. Как сказано в документации FasterXML. При использовании proguard аннотации kotlin.Metadata могут быть удалены, что предотвратит десериализацию. Добавьте правило proguard, чтобы сохранить класс kotlin.Metadata: -keep class kotlin.Metadata { *; }

  2. Попробуйте использовать @field:JsonView(View.AlbumSummary::class)

Спасибо за ответ. Есть идеи, как добавить proguard в мой проект?

Ace Falobi 04.07.2018 13:59

В модуле вашего приложения уже будет файл с именем proguard-rules.pro. Это ваш файл Proguard

Brijesh Joshi 04.07.2018 14:02

Я не могу найти ни одного файла proguard-rules в моем приложении или модуле проекта

Ace Falobi 04.07.2018 14:08

Создайте файл proguard-rules.pro в модуле вашего приложения. И чем из настройки приложения-> Ароматизаторы-> Файл Proguard выберите созданный вами файл, там он будет чем добавлен в ваш проект

Brijesh Joshi 04.07.2018 14:12

У меня была такая же проблема, и JsonView работал только после того, как я переместил поля из конструктора в тело класса. В этом случае вы не стали бы использовать класс данных, но вы все равно можете делегировать равный хэш-код toString частному внутреннему классу данных.

Другие вопросы по теме