Как настроить сопоставление объектов для MongoDB с Micronaut и Kotlin + KMongo? - PullRequest
0 голосов
/ 15 февраля 2019

У меня возникли трудности с настройкой сопоставления объектов для MongoDB в Micronaut с помощью Kotlin.Я получаю сообщения об ошибках типа:

Ошибка декодирования в «Актив» со следующим исключением:

Не удается найти открытый конструктор для «Актива».

Пользовательский кодек или PojoCodec может потребоваться явно настроить и зарегистрировать для обработки этого типа.org.bson.codecs.configuration.CodecConfigurationException: исключение произошло при декодировании с использованием AutomaticPojoCodec.Сбой декодирования в «Актив» со следующим исключением:

Не удается найти общедоступный конструктор для «Актива».

Может потребоваться явная настройка и регистрация пользовательского кодека или PojoCodec для регистрации этогоТип.

С KMongo это легко.Однако MongoClient, введенный Micronaut, не имеет реестра кодеков KMongo.

Я могу заставить его работать следующим образом:

    val db: MongoDatabase by lazy {
        val codecRegistry = ClassMappingType.codecRegistry(MongoClientSettings.getDefaultCodecRegistry())
        client.getDatabase("db-name").withCodecRegistry(codecRegistry)
    }

Этот код взят непосредственно из KMongo.(Кстати, использование database.withKMongo() привело к той же ошибке)

Хотя это работает, я хотел бы, чтобы Micronaut использовал KMongo для создания клиента или разрешил использовать свой кодек, как описано выше, используя конфигурацию(application.yml).

Здесь упоминается настройка codec-registry: https://micronaut -projects.github.io / micronaut-mongodb / latest / guide / configurationreference.html ,но я понятия не имею, что ввести в эту настройку, чтобы она заработала.

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 15 февраля 2019

Вы можете просто определить реестр кодеков как компонент.Поскольку вы не контролируете регистрируемый класс, вы можете создать фабрику

@Factory
class KMongoFactory {

    @Singleton
    fun kCodecRegistry(): CodecRegistry {
        return ClassMappingType.codecRegistry(MongoClientSettings.getDefaultCodecRegistry());
    }

}

Что-то похожее на вышесказанное должно сделать это

РЕДАКТИРОВАТЬ: помните, что MongoClients.getDefaultCodecRegistry() добавляетсяпо умолчанию

...