У меня есть коллекция монго, в которой есть поле String с именем role
. Это поле, в частности, всегда будет заполнено одним из этих трех вариантов: user
, admin
или guest
.
Именно по этой причине я решил создать перечисление, чтобы разработчикам было проще работать с ним, сохраняя при этом значение String в базе данных.
Я попытался получить документ из своей коллекции, ожидая, что KMongo сможет выполнить синтаксический анализ от String до Enum Role
и наоборот.
К сожалению, KMongo, похоже, не может этого сделать.
data class User(var role: Role, // 0 user, 1 admin, 2 guest
var email: String,
var password: String)
enum class Role{
user,
admin,
guest
}
Когда я попытался найти документ по его _id
, я получил это сообщение:
2019-05-21 11:39:01 [http-nio-8080-exec-1] ERROR c.p.p.c.SpringWebConfig$simpleMappingExceptionResolver$resolver$1 - Excepción general resolviendo una petición com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException: Instantiation of [simple type, class com.foo.user.User] value failed for JSON property role due to missing (therefore NULL) value for creator parameter role which is a non-nullable type at [Source: de.undercouch.bson4jackson.io.LittleEndianInputStream@3195529c; pos: 275] (through reference chain: com.foo.user.User["Role"])
Итак, мой вопрос: поддерживает ли KMongo перечисления в этих терминах?
Итак, я наконец нашел решение своей проблемы. Используя библиотеку Аннотации Джексона, я могу сериализовать и десериализовать свои перечисления так, как мне нужно. В моем случае я решил использовать их как строки, чтобы KMongo знал, как с ними работать.
@JsonFormat(shape = JsonFormat.Shape.STRING)
enum class Role {
user,
admin,
guest
}
Теперь я могу просто объявить свои атрибуты как тип перечисления, чтобы KMongo знал, что с ними делать.