Java 通量映射中的重载?
我想使用springJava 通量映射中的重载?,java,overloading,spring-data-mongodb,project-reactor,Java,Overloading,Spring Data Mongodb,Project Reactor,我想使用springReactiveMongoRepository从mongoDB流式处理多个事件,所有事件都继承自同一基本类型。接下来,我想对它们进行不同的处理,从而定义一个handle方法的几个重载,所有重载都用于一个子级。然而,编译器抱怨说,他找不到合适的方法 该测试方法举例说明了该问题: @Test public void polymorphismTest() { this.createFlux() .map(this::polymorphicMethod
ReactiveMongoRepository
从mongoDB流式处理多个事件,所有事件都继承自同一基本类型。接下来,我想对它们进行不同的处理,从而定义一个handle方法的几个重载,所有重载都用于一个子级。然而,编译器抱怨说,他找不到合适的方法
该测试方法举例说明了该问题:
@Test
public void polymorphismTest() {
this.createFlux()
.map(this::polymorphicMethod)
.subscribe();
}
private Flux<A> createFlux() {
A1 a1 = new A1();
a1.string1 = "foo";
A2 a2 = new A2();
a2.string2 = "bar";
return Flux.just(a1, a2);
}
private void polymorphicMethod(A1 a1) {
System.out.println(a1.string1);
}
private void polymorphicMethod(A2 a2) {
System.out.println(a2.string2);
}
@测试
公共void多态性测试(){
这是createFlux()
.map(此::多态方法)
.subscribe();
}
私有流量createFlux(){
A1=新的A1();
a1.1=“foo”;
A2=新的A2();
a2.2=“钢筋”;
返回通量.just(a1,a2);
}
私有void多态方法(A1){
System.out.println(a1.string1);
}
私有void多态方法(A2){
System.out.println(a2.string2);
}
我在某种程度上理解了这个问题,因为编译器无法知道我有一个适合所有继承类的方法。不过,如果有一个类似于我的方法的解决方案就好了,因为它(在我看来)干净易读
我知道,解决方案是在基类型中将句柄定义为抽象方法,并在继承的类中实现它,但这会破坏应用程序其余部分的功能方法,而且数据库中的事件应该是POJO
我还希望避免使用典型的命令模式方法,将类型映射到函数,但如果没有其他想法,这可能是解决方案。您可以利用Spring提供类型,帮助Reactor将适当的“事件”排序到适当的“事件处理程序” 例如,您可以定义以下内容:
公共接口事件监听器{
默认类getType(){
返回(类)GenericTypeResolver.resolveTypeArgument(getClass(),EventListener.Class);
}
单执行(E事件);
}
您现在可以执行以下操作:
EventListener<E> listener = ...
sourceFlux.ofType(listener.getType()).flatMap(listener::execute)
EventListener=。。。
sourceFlux.ofType(listener.getType()).flatMap(listener::execute)
使用Spring,您可以定义多个EventListener
实例(通过创建继承它的类并使用@Component
或使用该接口的多个@Bean
实例定义@Configuration
),您可以通过@Autowire
或@Bean
收集这些实例进行“注册”对于这些事件
这避免了需要定义巨大的映射,并且包含的代码与处理每种事件类型的代码一样多。首先感谢您的回答。我不确定我是否最终得到了它,但似乎type()的
函数正在按类型过滤流量。这不是我需要的。我有几个事件与相同的父事件需要顺序处理。我不认为有任何神奇的解决方案仅仅基于多态性,特别是如果你想在相同的原始序列中处理元素。这是命令模式!