Bson не объявляет правильное имя поля, объявленного в @BsonProperty

#mongodb #kotlin #bson

#mongodb #kotlin #bson

Вопрос:

@BsonProperty(«имя») в конструкторе не работает

Мой код класса данных

 package net.hyren.discord.bot.misc.punish.data

import org.bson.codecs.pojo.annotations.BsonIgnore
import org.bson.codecs.pojo.annotations.BsonProperty

/**
 * @author SrGutyerrez
 **/
data class DiscordPunishment(
        @BsonProperty(value = "id_long") val idLong: Long,
        val duration: Long
) {

    @BsonIgnore
    fun isActive(): Boolean = this.duration >= System.currentTimeMillis()

    override fun equals(other: Any?): Boolean {
        if (this === other) return true

        if (javaClass != other?.javaClass) return false

        other as DiscordPunishment

        if (idLong != other.idLong) return false

        return true
    }

    override fun hashCode(): Int {
        return idLong.hashCode()
    }

}
  

Сохраненное значение:

введите описание изображения здесь

Правильное имя выходного поля в mongo db должно быть «id_long», а не «idLong»

Ответ №1:

Правильно аннотированный класс может выглядеть следующим образом:

 data class DiscordPunishment @BsonCreator constructor(
        @param:BsonProperty("id_long")
        @field:BsonProperty("id_long")
        val idLong: Long,
        @param:BsonProperty("duration")
        val duration: Long
) {

    @BsonIgnore
    fun isActive(): Boolean = this.duration >= System.currentTimeMillis()

    // ...
}

  

Когда вы аннотируете свойство или основной параметр конструктора, существует несколько элементов Java, которые генерируются из соответствующего элемента Kotlin, и, следовательно, несколько возможных местоположений для аннотации в сгенерированном байт-коде Java. — Использование аннотаций -Цели сайта

  1. В вашем случае аннотация должна присутствовать в поле (или получателе), поэтому вам нужно использовать @field:BsonProperty("id_long") синтаксис.
  2. Поскольку DiscordPunishment класс не имеет конструктора по умолчанию, вам нужна @BsonCreator аннотация.
  3. @BsonCreator требуется @BsonProperty для каждого параметра

Весенние данные Mongo DB:

Если вы используете Spring Data Mongo DB, аннотации Bson не имеют никакого эффекта, но вы можете просто использовать аннотацию @Field . Это @BsonCreator не обязательно.