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

咨询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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:05:28