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
相关产品推荐
相关产品推荐

