#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. — Использование аннотаций -Цели сайта
- В вашем случае аннотация должна присутствовать в поле (или получателе), поэтому вам нужно использовать
@field:BsonProperty("id_long")
синтаксис. - Поскольку
DiscordPunishment
класс не имеет конструктора по умолчанию, вам нужна@BsonCreator
аннотация. @BsonCreator
требуется@BsonProperty
для каждого параметра
Весенние данные Mongo DB:
Если вы используете Spring Data Mongo DB, аннотации Bson не имеют никакого эффекта, но вы можете просто использовать аннотацию @Field . Это @BsonCreator
не обязательно.