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

Java Mutiny中Uni.createFrom().future()的编译错误与返回值问题

解决你的Java + Mutiny + Redis问题

问题1:编译器报错的根源与修复

你遇到的编译错误,是因为Mutiny的Uni.createFrom().future()只认Java标准库的CompletableFuture,但你传的是Vertx自己的io.vertx.core.Future,类型完全不匹配。解决办法很简单:把Vertx Future转成CompletableFuture就行,用Vertx自带的toCompletionStage().toCompletableFuture()方法。

问题2:生成正确的Uni返回值

要把Redis返回的Response转成String并封装到Uni里,不需要额外的订阅操作,直接在Future转换过程中处理数据,或者用Uni的map操作就行。

修改后的完整代码

import io.vertx.redis.client.Redis;
import io.smallrye.mutiny.Uni;
import io.vertx.core.Future;
import io.vertx.redis.client.Response;
import io.vertx.redis.client.Request;
import io.vertx.redis.client.Command;

private final Redis redisClient;

// 保留你的redisClient初始化代码
this.redisClient = Redis.createClient(vertx);

public Uni<String> test() {
    // 执行Redis请求,拿到Vertx Future
    Future<Response> futureResponse = this.redisClient.send(
            Request.cmd(Command.create("JSON.GET")).arg("foo")
    );

    // 转成CompletableFuture,同时把Response转成String
    CompletableFuture<String> completableFuture = futureResponse
            .toCompletionStage()
            .thenApply(response -> {
                // 这里根据Redis实际返回格式调整,比如如果返回带引号就去掉
                return response != null ? response.toString().replace("\"", "") : null;
            });

    // 从CompletableFuture生成Uni并返回
    return Uni.createFrom().future(completableFuture);
}

更清爽的写法(用Mutiny版Vertx客户端)

如果你的项目能引入mutiny-vertx-core依赖,直接用Mutiny风格的Redis客户端,连Future转换都省了:

import io.smallrye.mutiny.Uni;
import io.vertx.mutiny.redis.client.Redis;
import io.vertx.mutiny.redis.client.Request;
import io.vertx.mutiny.redis.client.Command;

private final Redis redisClient;

// 初始化Mutiny版的Redis客户端
this.redisClient = Redis.createClient(vertx);

public Uni<String> test() {
    return redisClient.send(Request.cmd(Command.create("JSON.GET")).arg("foo"))
            .map(response -> response != null ? response.toString().replace("\"", "") : null);
}

额外提醒

  • 别再用onComplete回调了,它只是注册一个完成后的钩子,不会改变Future的返回值,纯纯多余代码。
  • 注意Redis的JSON.GET返回的字符串可能带双引号,比如"bar",所以上面代码里加了replace("\"", "")来处理,你可以根据实际返回调整这部分逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:55:14