【问题标题】:Updating webclient response from database从数据库更新 webclient 响应
【发布时间】:2021-11-06 22:24:10
【问题描述】:

我遇到无法更新数据库列的情况。 问题是只执行了方法setIsPurchased,并且SQL表中的标志is_purchase更改为true,但是下一行setPurchasedDate必须设置当前时间并没有执行。来自数据库的响应是Mono<Void> 类型。

fun purchase(uuid: UUID, request: PurchaseInternalRequest) =
        extraProductTransactionService.findTransactionByUuid(uuid)
            .doOnNext { it.validateNotPurchased() }
            .flatMap { purchaseViaSupplier(it, request) }
            .flatMap { extraProductTransactionService.setIsPurchased(uuid) }
            .flatMap { extraProductTransactionService.setPurchasedDate(uuid) }
            .onErrorMap(Exception::class.java) { Exception(it.status) }
            .then()

这两种方法的查询很简单,如下所示:

对于setIsPurchased

update extra_product_transactions SET is_purchased = 1 where uuid = :uuid

对于setPurchasedDate

update extra_product_transactions SET purchased_date = CURRENT_TIMESTAMP where uuid = :uuid

【问题讨论】:

    标签: sql kotlin sql-update webclient flatmap


    【解决方案1】:

    本质上,Mono<Void> 永远不会发出元素 onNext()。话虽如此,.flatMap { extraProductTransactionService.setPurchasedDate(uuid) } 永远不会被调用。

    我假设您对 set 方法的返回值不感兴趣,因此您可以执行以下操作:

    fun purchase(uuid: UUID, request: PurchaseInternalRequest) =
        extraProductTransactionService.findTransactionByUuid(uuid)
            .doOnNext { it.validateNotPurchased() }
            .flatMap { purchaseViaSupplier(it, request) }
            .flatMap { 
              extraProductTransactionService.setIsPurchased(uuid).subscribe()
              extraProductTransactionService.setPurchasedDate(uuid)
            }
            .onErrorMap(Exception::class.java) { Exception(it.status) }
            .then()
    

    【讨论】:

    • 感谢您的方法,我决定将其更改为一个查询。我的意思是setIsPurchasedAndPurchasedAt。为了您的信息,我尝试将返回类型更改为 Mono<void> (Mono) 以外的其他内容,但问题并没有消失
    • 我很困惑。你的问题现在解决了吗?
    • 是的,现在我的代码看起来像fun purchase(uuid: UUID, request: PurchaseInternalRequest) = extraProductTransactionService.findTransactionByUuid(uuid) .doOnNext { it.validateNotPurchased() } .flatMap { purchaseViaSupplier(it, request) } .flatMap { extraProductTransactionService.setIsPurchasedAndPurchasedAt(uuid) } .onErrorMap(Exception::class.java) { Exception(it.status) } .then() 其中setIsPurchasedAndPurchasedAt 是更新两个值的查询。最好的问候
    • PS 抱歉消息的风格,但在这里我无法编辑它
    • 太棒了!如果我的回答帮助您投票甚至接受,则可以作为您问题的答案,以便其他人可以从中受益并轻松理解解决方案的外观。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    相关资源
    最近更新 更多