Spring Data MongoDB – как обновить с помощью @Update, не устанавливая для большинства полей значение null?

После прочтения документации Spring по адресу https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongodb.repositories.queries.update, Я написал этот метод репозитория:

@Repository
interface TokenRepo: MongoRepository<TokenModel, String> {

    @Query("{ authorizationState: ?0 }")
    @Update("{ authorizationState: ?0, authorizationCode: ?1 }")
    fun updateCode(state: String, code: String): Int

}

Затем я использую это так:

    @Test fun testUpdate() {
        val token = TestTokenModels().makeToken()
        val tokenSaved = tokenRepo.save(token)
        assertThat(tokenSaved).isNotNull.isEqualTo(token)
        assertThat(tokenSaved.requestTimestampMs).isNotNull()
        assertThat(tokenRepo.findByState(token.authorizationState)).isNotNull.isEqualTo(token)

        tokenRepo.updateCode(token.authorizationState, "someCode")
        val tokenUpdated = tokenRepo.findByState(token.authorizationState)  // FAILS!
        assertThat(tokenUpdated).isNotNull
        assertThat(tokenUpdated!!.authorizationCode).isNotNull.isEqualTo("someCode")
    }

Но это не удается при обратном чтении из базы данных, потому что почти все поля были установлены в null:

org.springframework.data.mapping.model.MappingInstantiationException: 
Failed to instantiate com.tracker.bl.token.TokenModel using constructor 
fun `<init>`(kotlin.String, com.tracker.bl.token.TokenModel.Status, kotlin.String, kotlin.String, kotlin.String, kotlin.Long, kotlin.String, kotlin.String, kotlin.String?, kotlin.String?, com.tracker.rest.Oauth2TokenType, kotlin.String?, kotlin.String?, kotlin.Long?, java.time.ZonedDateTime, kotlin.String?): com.tracker.bl.token.TokenModel with arguments 637e4686ae781b603ac77c12,null,null,null,null,null,null,tokenFlowStateVC8g80BT,null,null,null,null,null,null,null,null,65026,null

    at org.springframework.data.mapping.model.
    KotlinClassGeneratingEntityInstantiator$DefaultingKotlinClassInstantiatorAdapter
    .createInstance(KotlinClassGeneratingEntityInstantiator.java:215)

Как я должен использовать @Update? Или он предназначен только для таких вещей, как $inc и $push? Документы на самом деле довольно кратки по этой теме. Я относительно новичок в MongoDB.

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

Ответы 1

Ответ принят как подходящий

Ладно, это было быстро. Это я был новичком в MongoDB.

Spring Data MongoDB — это всего лишь тонкий слой, поэтому нужно следовать языку запросов MongoDB до такой степени, что обновление происходит через $set { ... }.

Итак, метод должен быть таким:

    @Query("{ authorizationState: ?0 }")
    @Update("{ '\$set': { authorizationCode: ?1 } }")
    fun updateCode(state: String, code: String): Int

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

Похожие вопросы

Какой EIP использовать: получить конфигурацию по содержимому сообщения, отображению, фильтрации и OAuth, а затем отправить, повторить попытку отправки только части
Java.lang.NoClassDefFoundError: исключение javax/activation/DataSource, когда я пытаюсь отправить электронное письмо в своем приложении Java Swing
Как сделать так, чтобы дочерний проект Maven имел версию, отличную от родительской?
POST-запрос не авторизован
Одна и та же версия Java выдает разные выходные данные для двойного значения
X-Frame-Options: DENY работает только на конечных точках внутреннего порта
Анализатор GPX для Android — нет поставщика контента
Получение NULL в качестве значения по умолчанию с помощью Java Stream уменьшает, когда все элементы имеют значение null, по-прежнему получая ненулевое значение, когда некоторые элементы не являются нулевыми
Файлы application.yaml для запуска некоторых приложений Spring Boot
Является ли семафор потокобезопасным, если он допускает переменную больше 1?