咨询Uni<>与Reactor的Mono<>/Flux<>兼容工具及整合方案
解决Hibernate Reactive Uni与Spring WebFlux Mono/Flux兼容问题
不用自己折腾自定义Spring Starter,Hibernate Reactive官方和Spring本身就提供了现成的兼容方案:
使用Hibernate官方Reactor适配模块
Hibernate Reactive专门提供了hibernate-reactive-adapter-reactor模块,内置的ReactorAdapter类可以直接实现Uni与Mono/Flux的双向转换。先添加对应依赖(以Maven为例):
<dependency> <groupId>org.hibernate.reactive</groupId> <artifactId>hibernate-reactive-adapter-reactor</artifactId> <version>与你的Hibernate Reactive版本保持一致</version> </dependency>转换示例:
- 将
Uni<T>转为Mono<T>:Uni<User> uniUser = session.find(User.class, userId); Mono<User> monoUser = ReactorAdapter.mono(uniUser); - 将
Mono<T>转为Uni<T>:Mono<User> monoUser = userRepository.findById(userId); Uni<User> uniUser = ReactorAdapter.uni(monoUser); - 批量查询的
Multi<T>转为Flux<T>:Multi<User> multiUsers = session.createQuery("from User", User.class).getResultMulti(); Flux<User> fluxUsers = ReactorAdapter.flux(multiUsers);
- 将
Spring Boot自动适配(推荐)
如果你使用Spring Boot 3.x及以上版本,引入spring-boot-starter-data-jpa-reactive依赖后,Spring会自动处理Hibernate Reactive类型与Reactor类型的转换,无需手动调用转换方法:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa-reactive</artifactId> </dependency>定义Reactive Repository时直接返回
Mono/Flux:public interface UserRepository extends ReactiveCrudRepository<User, Long> { Mono<User> findByUsername(String username); Flux<User> findByAgeGreaterThan(int age); }在WebFlux控制器中直接使用:
@GetMapping("/users/{id}") public Mono<ResponseEntity<User>> getUser(@PathVariable Long id) { return userRepository.findById(id) .map(ResponseEntity::ok) .defaultIfEmpty(ResponseEntity.notFound().build()); }自定义转换工具(特殊场景)
若需要自定义转换逻辑,也可以基于Uni的订阅机制实现简单工具类:public class UniReactorConverter { public static <T> Mono<T> uniToMono(Uni<T> uni) { return Mono.create(sink -> { uni.subscribe( sink::success, sink::error, () -> sink.success(null) ); }); } public static <T> Flux<T> multiToFlux(Multi<T> multi) { return Flux.create(sink -> { multi.subscribe( sink::next, sink::error, sink::complete ); }); } }
内容的提问来源于stack exchange,提问作者h1alexbel
相关产品推荐
相关产品推荐

