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

Vert.x服务代理改为返回Uni<T>后代码生成失败求助

Vert.x服务代理使用Uni返回值编译报错解决方案

问题重现

原本返回Future<T>的Vert.x服务接口可正常生成代理,但按照Smallrye Mutiny文档将返回值改为Uni<T>后,执行mvn clean compile时触发错误:

Could not generate model for com.example.beers.BarmanService#giveMeAStaticBeer(java.lang.String): Proxy methods must have void or Fluent returns

错误原因

Vert.x原生的@ProxyGen注解仅支持返回Vert.x原生异步类型(Future)、void或fluent风格返回值,并不直接兼容Smallrye Mutiny的Uni<T>类型。Mutiny的异步API需要通过专门的代码生成器创建适配层,而非直接修改服务接口的返回值。

解决方案

1. 恢复服务接口的原生返回类型

将服务接口的返回值改回Vert.x的Future<T>,保留@VertxGen和@ProxyGen注解:

// BarmanService.java
@VertxGen
@ProxyGen
public interface BarmanService {
    Future<Beer> giveMeAStaticBeer(String customerName);
    Future<Integer> getMyBill(String customerName);
    Future<Void> payMyBill(String customerName);

    static BarmanService createProxy(Vertx vertx, String address) {
        return new BarmanServiceVertxEBProxy(vertx, address);
    }
}

2. 在实现类中适配Mutiny Uni

服务实现类可先编写Mutiny风格的逻辑,再通过UniHelper.toFuture()转换为Vertx Future返回:

// BarmanServiceImpl.java
public class BarmanServiceImpl implements BarmanService {
    Map<String, Integer> bills;

    public BarmanServiceImpl() {
        this.bills = new HashMap<>();
    }

    @Override
    public Future<Beer> giveMeAStaticBeer(String customerName) {
        Beer beer = new Beer("Workshop River Stout", "English Stout", 5);
        Uni<Beer> uni = Uni.createFrom().item(beer);
        return UniHelper.toFuture(uni);
    }

    @Override
    public Future<Integer> getMyBill(String customerName) {
        return UniHelper.toFuture(Uni.createFrom().item(bills.get(customerName)));
    }

    @Override
    public Future<Void> payMyBill(String customerName) {
        bills.remove(customerName);
        System.out.println("Removed debt of " + customerName);
        return UniHelper.toFuture(Uni.createFrom().voidItem());
    }
}

3. 依赖配置保持不变

确保pom.xml中已包含Mutiny相关依赖,代码生成器会自动生成适配类:

<dependencies>
    <!-- Vert.x核心依赖 -->
    <dependency>
        <groupId>io.vertx</groupId>
        <artifactId>vertx-codegen</artifactId>
        <classifier>processor</classifier>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>io.vertx</groupId>
        <artifactId>vertx-service-proxy</artifactId>
    </dependency>
    <!-- Mutiny Vert.x绑定 -->
    <dependency>
        <groupId>io.smallrye.reactive</groupId>
        <artifactId>smallrye-mutiny-vertx-core</artifactId>
        <version>2.30.1</version>
    </dependency>
    <dependency>
        <groupId>io.smallrye.reactive</groupId>
        <artifactId>vertx-mutiny-generator</artifactId>
        <version>2.30.1</version>
    </dependency>
</dependencies>

自动生成的Mutiny适配类使用方法

编译后会自动生成com.example.mutiny.beers.BarmanService类,这是原生服务接口的Mutiny包装类,使用方式如下:

创建Mutiny风格的服务代理

// 初始化Mutiny Vertx实例
io.vertx.mutiny.core.Vertx mutinyVertx = io.vertx.mutiny.core.Vertx.vertx();
// 创建Mutiny版服务代理
com.example.mutiny.beers.BarmanService mutinyService = 
    com.example.mutiny.beers.BarmanService.createProxy(mutinyVertx, "your-service-address");

调用服务方法

  • 异步订阅结果:
mutinyService.giveMeAStaticBeer("Alice")
    .subscribe().with(
        beer -> System.out.println("拿到啤酒:" + beer.getName()),
        error -> error.printStackTrace()
    );
  • 阻塞获取结果(仅用于测试或非异步场景):
Beer beer = mutinyService.giveMeAStaticBeerAndAwait("Bob");
  • 触发操作不关心结果:
mutinyService.payMyBillAndForget("Charlie");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:25:14