2017-12-27 30 views
0

私はSpring Boot 2.0.0.M7とProject Reactorを使用しています。私の問題は、単体テストの作成中に遭遇したいくつかの奇妙な動作に関連しています。私はflatMapの出力をリポジトリにフィードしようとしているときにこれにも遭遇しました。Reactor - flatMapの出力でブロックを呼び出すと、ClassCastExceptionが発生します。

Mono<Foo> create(Mono<FooResource> resourceMono) { 
    resourceMono.flatMap({ 
     // convert resource into Foo domain Entity 
     return new Foo() 
    }) 
} 

このクロージャは、flatMapの戻り値に起因Mono<Foo>を放出すべきです。

def createdFoo = Foo.create(Mono.just(fooResource)).block() 

スタックトレース:

java.lang.ClassCastException: com.example.Foo cannot be cast to org.reactivestreams.Publisher 

at reactor.core.publisher.FluxFlatMap.trySubscribeScalarMap(FluxFlatMap.java:141) 
at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:53) 
at reactor.core.publisher.Mono.block(Mono.java:1161) 

これはMonoJust実装しているために発生するように見える購読し、得られFooを取得するためにblock()を呼び出すときしかし、ClassCastException

FluxFlatMap.trySubscribeScalarMapでテストコードがありますCallableなので、trySubscribeScalarMapはそれをアンラップしようとします。

テスト以外のシナリオでは、同様のエラーが発生します。

Mono<ServerResponse> createFoo(ServerRequest request) { 
    def body = request.body(BodyExtractors.toMono(FooResource)) 
    ok().body(fromPublisher(Foo.create(body) 
     .flatMap({fooRepository.save(it)}), Foo)) 
} 

スタックトレース:

java.lang.ClassCastException: com.example.Foo cannot be cast to reactor.core.publisher.Mono 
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:118) [reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:450) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1092) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
at reactor.core.publisher.MonoSingle$SingleSubscriber.onComplete(MonoSingle.java:171) ~[reactor-core-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
<...> 
Assembly trace from producer [reactor.core.publisher.MonoFlatMap] : 
reactor.core.publisher.Mono.flatMap(Mono.java:2059) 
org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoCachedMethodSiteNoUnwrap.invoke(PojoMetaMethodSite.java:213) 
org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56) 
org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) 
com.example.Foo.create(Foo.groovy:28) 
org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) 
com.example.FooHandlerFunctions.createFoo(FooHandlerFunctions.groovy:48) 

Mono.just(foo)flatMap閉鎖の出力をラッピングは両方の問題を解決します。しかし、それは必要ではないようです。私が間違ったことをやっているのですか、またはちょっと誤解してflatMapがここで働くのですか?

答えて

1

flatmapは返す必要があり、そのFunctionを取るMono(I推測グルーヴィーFooPublisherを実装していないようだとあなたは、間違った型を返してみましょう?)

関連する問題