1

I have a project in springboot 3, I want to consume some service from internet, I implemented a webclient, here my webclien definition

@Bean
    public WebClient createWebClient(@Value("${internet.service.url}") String urlInternet) {
        return WebClient.builder().baseUrl(urlInternet)
                .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .build();
    }

Here my invocation

public InternetCreateResponse walletCreate(InternetCreateRequest request) {
    Mono<InternetCreateResponse> response =  webClient.post().uri("create_account")
            .body(Mono.just(request), InternetCreateRequest.class)
            .retrieve()
            .onStatus(
                    (HttpStatusCode::is4xxClientError),
                    error -> Mono.error(new RuntimeException("something was wrong")))
            .onStatus(HttpStatusCode::is5xxServerError,
                    error -> Mono.error(new RuntimeException("Server is down")))
            .bodyToMono(InternetCreateResponse.class);
    return response.block();
}

But when I executed response.block() I have an error, here stacktrace

Exception in thread "grpc-default-executor-0" java.lang.NoSuchMethodError: 'reactor.util.context.ContextView reactor.core.publisher.MonoSink.contextView()'
at reactor.netty.http.client.HttpClientConnect$HttpObserver.<init>(HttpClientConnect.java:329)
at reactor.netty.http.client.HttpClientConnect$MonoHttpConnect.lambda$subscribe$0(HttpClientConnect.java:259)
at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:57)
at reactor.core.publisher.FluxRetryWhen.subscribe(FluxRetryWhen.java:77)
at reactor.core.publisher.MonoRetryWhen.subscribeOrReturn(MonoRetryWhen.java:46)
at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:57)
at reactor.netty.http.client.HttpClientConnect$MonoHttpConnect.subscribe(HttpClientConnect.java:272)
at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)
at reactor.core.publisher.MonoDeferContextual.subscribe(MonoDeferContextual.java:55)
at reactor.core.publisher.Mono.subscribe(Mono.java:4361)
at reactor.core.publisher.Mono.block(Mono.java:1705)
at io.grpc.stub.ServerCalls$UnaryServerCallHandler$UnaryServerCallListener.onHalfClose(ServerCalls.java:182)
at io.grpc.PartialForwardingServerCallListener.onHalfClose(PartialForwardingServerCallListener.java:35)
at io.grpc.ForwardingServerCallListener.onHalfClose(ForwardingServerCallListener.java:23)
at io.grpc.ForwardingServerCallListener$SimpleForwardingServerCallListener.onHalfClose(ForwardingServerCallListener.java:40)
at io.grpc.PartialForwardingServerCallListener.onHalfClose(PartialForwardingServerCallListener.java:35)
at io.grpc.ForwardingServerCallListener.onHalfClose(ForwardingServerCallListener.java:23)
at io.grpc.ForwardingServerCallListener$SimpleForwardingServerCallListener.onHalfClose(ForwardingServerCallListener.java:40)
at io.grpc.Contexts$ContextualizedServerCallListener.onHalfClose(Contexts.java:86)
at io.grpc.internal.ServerCallImpl$ServerStreamListenerImpl.halfClosed(ServerCallImpl.java:340)
at io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1HalfClosed.runInContext(ServerImpl.java:866)
at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:133)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)

Here spring webflux and reactor

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
        <dependency>
            <groupId>io.projectreactor</groupId>
            <artifactId>reactor-core</artifactId>
            <version>3.5.3</version>
        </dependency>

But I haven't idea I got reactor-core version 3.4.10

enter image description here

The message in stacktrace is clear, but unfortunately I can't tell maven I want to exclude that version, I saw some link like this or this or this or this but it doesn't work that I expected. I want to work with reactor-core version 3.5.3 that contains reactor.core.publisher.MonoSink.contextView() method.

Any idea how I can do it?

Or anoter way I can do it?

5frags
  • 157
  • 10

2 Answers2

1

If you want to figure out where 3.4.10 is coming from, use mvn dependency:tree which will output the dependency graph. Using that, you can determine which jar is transitively providing reactor-core. Once you've found the jar, simply add reactor-core as an exclusion.

I should warn you, though, unless you have a very good reason for overriding the version that Spring is providing, I wouldn't change it.

lane.maxwell
  • 5,002
  • 1
  • 20
  • 30
0

This dependency reactor-core is a dependency of spring-boot-web-flux.

By adding the dependency manually you override the dependency that came bundled with the starter dependency and it's possible that they are not compatible.

If you remove the reactor core dependency from your pom and do a clean install the same error occurs?