初次使用Multi:SubmissionPublisher适配publisher方法类型错误求助
问题:Java SubmissionPublisher 无法适配 Quarkus Multi.createFrom().publisher()
你遇到的类型错误核心原因是混淆了两个同名但分属不同API规范的Publisher接口:
- Java 标准库提供的
*java.util.concurrent.Flow.Publisher*(SubmissionPublisher实现的是这个接口) - Reactive Streams 规范定义的
*org.reactivestreams.Publisher*(Multi.createFrom().publisher()要求的参数类型)
这两个接口方法签名完全一致,但属于不同的包,Java会将它们视为完全不同的类型,因此直接传入SubmissionPublisher或强制转换都无法解决类型不匹配问题。
解决方案:使用适配工具类转换类型
Quarkus 依赖的 SmallRye Reactive 提供了FlowAdapters工具类,专门用于在Java Flow组件和Reactive Streams组件之间做类型适配。
修改后的代码示例:
import io.smallrye.mutiny.subscription.FlowAdapters; import java.util.concurrent.SubmissionPublisher; import io.smallrye.mutiny.Multi; public class Demo { public static void main(String[] args) { final SubmissionPublisher<String> subPub1 = new SubmissionPublisher<>(); // 通过FlowAdapters将Java Flow Publisher转换为Reactive Streams Publisher final var m1 = Multi.createFrom().publisher(FlowAdapters.toPublisher(subPub1)); } }
FlowAdapters.toPublisher()方法会把java.util.concurrent.Flow.Publisher包装成符合Reactive Streams规范的org.reactivestreams.Publisher,从而满足Multi.createFrom().publisher()的参数要求。
内容的提问来源于stack exchange,提问作者John Boudreaux
相关产品推荐
相关产品推荐

