You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

响应式编程中如何从Mono类型中返回int类型值

问题原因
  • Mono是Reactor框架提供的异步响应式容器,map属于容器操作符,执行后返回的依然是Mono<T>类型,不会直接返回容器内存储的实际值,因此你直接将counter.map(u -> u.getSeq())赋值给int变量,必然会出现类型不匹配错误。
  • 你使用的subscribe是异步回调逻辑,调用后会立刻返回,不会等待MongoDB操作执行完成,回调逻辑执行前你读取自定义的cs对象中的seq属性,大概率拿不到正确结果。
  • 原代码末尾的三元表达式两个分支返回值类型不兼容,int类型和字符串"1"不能混用,本身存在语法错误。
解决方案

方案1:同步阻塞返回int类型

如果你确实需要方法同步返回int类型,可以使用block()方法阻塞当前线程,等待Mono执行完成后拿到内部的实际值:

public int getNextSequence(String seqName) {
    Mono<CustomSequences> counter = 
        reactiveMongoOperations.findAndModify(
            query(where("_id").is(seqName)),
            new Update().inc("seq", 1),
            options().returnNew(true).upsert(true),
            CustomSequences.class);
    Integer seq = counter.map(CustomSequences::getSeq).block();
    // 空值默认返回int类型的1
    return seq != null ? seq : 1;
}

注意:block()方法不能在响应式流的核心调度线程中调用,否则会抛出阻塞非法异常,仅适合非响应式上下文调用的场景。

方案2:符合响应式规范的异步实现

如果是在响应式编程场景下使用,建议方法直接返回Mono<Integer>,避免不必要的阻塞:

public Mono<Integer> getNextSequence(String seqName) {
    return reactiveMongoOperations.findAndModify(
            query(where("_id").is(seqName)),
            new Update().inc("seq", 1),
            options().returnNew(true).upsert(true),
            CustomSequences.class)
        .map(CustomSequences::getSeq)
        // 空值默认返回1
        .defaultIfEmpty(1);
}

内容的提问来源于stack exchange,提问作者cafff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:45:04