Skip to content

Bootstraping GraphQL clients

In general, it is recommended to use SmallRye GraphQL client through the Quarkus extension, or the WildFly feature pack, each of them having their own documentation about how to set up dependencies and bootstrap a client. It is however also possible to use SmallRye GraphQL Client in a standalone application outside any container. The single dependency that you need is io.smallrye:smallrye-graphql-client-implementation-vertx, as the Vert.x based implementation is currently the only supported one.

If you're using the client as a script and notice that the JVM doesn't exit even after you close the client instance, it's probably because the client is maintaining a Vertx instance that it created automatically. To solve this issue, you might need to create a Vertx instance on your own, pass it to the client builder, and then close it after closing the client. See the following JBang snippet for an example.

Logging with a standalone (Java SE) application using the SmallRye GraphQL Client

If you want to properly configure logging in a standalone application, you will also need to add a logging implementation to the classpath. The client code uses the JBoss Logging facade, so you can, for example, use the JBoss Logmanager. Add the org.jboss.logmanager:jboss-logmanager dependency to your project(it needs to be on the runtime classpath). You will also need to run the application with this system property declared: -Djava.util.logging.manager=org.jboss.logmanager.LogManager.

To customize logging levels etc, it picks up the logging.properties file from the root of the runtime classpath, so, for example if using Maven and the exec plugin to start the application, you would place the file into src/main/resources/logging.properties. For an example of the contents of this file, see https://github.com/jamezp/jboss-logging-example/blob/master/src/main/resources/logging.properties.

Using with JBang

This is a full script runnable directly with JBang that uses a dynamic client for connecting to countries.trevorblades.com to obtain a list of countries from its database.

///usr/bin/env jbang "$0" "$@" ; exit $?
//DEPS io.smallrye:smallrye-graphql-client-implementation-vertx:RELEASE

import io.smallrye.graphql.client.dynamic.api.DynamicGraphQLClient;
import io.smallrye.graphql.client.Response;
import io.smallrye.graphql.client.vertx.dynamic.VertxDynamicGraphQLClientBuilder;

import io.vertx.core.Vertx;

// Has a multiline string literal, requires Java 15+!
class Client {
    public static void main(String... args) throws Exception {
        Vertx vertx = Vertx.vertx();
        DynamicGraphQLClient client = new VertxDynamicGraphQLClientBuilder()
            .url("https://countries.trevorblades.com")
            .vertx(vertx)
            .build();
        try {
            Response response = client.executeSync("""
                query {
                  countries {
                    name
                  }
                }
                """);
            System.out.println(response);
        } finally {
            client.close();
            vertx.close();
        }
    }
}

Save this file as Client.java and execute with jbang Client.java.