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原生异步类型(Futurevoid或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
相关产品推荐
相关产品推荐

