I’m trying to create a java graphQL client for my app that will consume a graphql endpoint (example : https://countries.trevorblades.com/).
My app uses Spring framework 5 (it’s not spring-boot app).
On spring documentation here https://docs.spring.io/spring-graphql/reference/client.html, You can create a client by providing either RestClient for blocking calls or WebClient for non-blocking calls.
I added spring-webflux dependency so I can use WebClient. My pom.xml looks like this:
<dependency>
<groupId>org.springframework.graphql</groupId>
<artifactId>spring-graphql</artifactId>
<version>1.2.4</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webflux</artifactId>
<version>5.3.33</version>
</dependency>
Then, I have created then a Client builder that uses WebClient:
public class DefaultGraphQlClientBuilder implements GraphQlClientBuilder {
@Override
public HttpGraphQlClient buildClient(String graphQLUrl, Map<String, String> headers) {
WebClient client = WebClient.builder()
.baseUrl(graphQLUrl)
.build();HttpGraphQlClient.builder()
HttpGraphQlClient.Builder<?> graphQlClientBuilder = HttpGraphQlClient.builder(client);
if (Objects.nonNull(headers)) {
headers.forEach((key, value) -> {
graphQlClientBuilder.header(key, value);
});
}
return graphQlClientBuilder.build();
}
When I start my server, I have this exception:
java.lang.IllegalStateException: No suitable default ClientHttpConnector found
I googled that, and it says that I need some netty jars, so I added these dependencies:
<dependency>
<groupId>io.projectreactor.netty</groupId>
<artifactId>reactor-netty</artifactId>
<version>1.1.18</version>
</dependency>
<dependency>
<groupId>io.projectreactor.netty</groupId>
<artifactId>reactor-netty</artifactId>
<version>1.0.33</version>
</dependency>
<dependency>
<groupId>io.projectreactor.netty</groupId>
<artifactId>reactor-netty-http</artifactId>
<version>1.0.33</version>
</dependency>
<dependency>
<groupId>io.projectreactor.netty</groupId>
<artifactId>reactor-netty-core</artifactId>
<version>1.0.33</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-resolver-dns</artifactId>
<version>4.1.94.Final</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-codec-http2</artifactId>
<version>4.1.94.Final</version>
</dependency>
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-java</artifactId>
<version>22.1</version>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-core</artifactId>
<version>3.4.33</version>
</dependency>
My Server finally starts, but when I call the service that uses the ‘DefaultGraphQlClientBuilder’ i have this exception:
at reactor.netty.http.client.HttpClientConnect$HttpObserver.<init>(HttpClientConnect.java:333)
at reactor.netty.http.client.HttpClientConnect$MonoHttpConnect.lambda$subscribe$0(HttpClientConnect.java:263)
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)```
So my question is how I can use spring-graphql to create a proper client ?
Thanks