Skip to content

A Java GraphQL client annotation processor, generate a client class from a GraphQL schema file, and a Java interface

License

Notifications You must be signed in to change notification settings

JacobMountain/graphql-java-client

Repository files navigation

graphql-client Build + Test Documentation Maven Central

A Java GraphQL client annotation processor, generate a client class from a graphql schema file, and a Java interface.

Usage guide

1. Generate a graphql schema file:

schema {
    query: Query
}
# The query type, represents all of the entry points into our object graph
type Query {
    hero(episode: Episode): Character
}
# The episodes in the Star Wars trilogy
enum Episode {
    # Star Wars Episode IV: A New Hope, released in 1977.
    NEWHOPE
    # Star Wars Episode V: The Empire Strikes Back, released in 1980.
    EMPIRE
    # Star Wars Episode VI: Return of the Jedi, released in 1983.
    JEDI
}
# A character from the Star Wars universe
interface Character {
    # The ID of the character
    id: ID!
    # The name of the character
    name: String!
    # The friends of the character, or an empty list if they have none
    friends: [Character]
}
# Units of height
enum LengthUnit {
    # The standard unit around the world
    METER
    # Primarily used in the United States
    FOOT
}
# A humanoid creature from the Star Wars universe
type Human implements Character {
    # The ID of the human
    id: ID!
    # What this human calls themselves
    name: String!
    # The home planet of the human, or null if unknown
    homePlanet: String
    # Height in the preferred unit, default is meters
    height(unit: LengthUnit = METER): Float
    # The friends of the character, or an empty list if they have none
    friends: [Character]
}
# An autonomous mechanical character in the Star Wars universe
type Droid implements Character {
    # The ID of the droid
    id: ID!
    # What others call this droid
    name: String!
    # This droid's friends, or an empty list if they have none
    friends: [Character]
    # This droid's primary function
    primaryFunction: String
}

2. Create a java interface

@GraphQLClient(
    schema = "Schema.gql",
    mapping = {
            @GraphQLClient.Scalar(from = "ID", to = String.class)
    },
    maxDepth = 5, // the max depth to use for graphql queries
    nullChecking = true, // whether we should add client side null checks,
    reactive = false
)
public interface StarWarsClient {}

if this is the first time you've created the interface it may be a good idea to run build to generate all the DTO classes and to reduce IDE/compilation errors.

3. Add corresponding methods to the interface that match up with the schema

@GraphQLClient(
    schema = "Schema.gql",
    mapping = {
            @GraphQLClient.Scalar(from = "ID", to = String.class)
    },
    maxDepth = 5, // the max depth to use for graphql queries
    nullChecking = true // whether we should add client side null checks
)
public interface StarWarsClient {

    @GraphQLQuery("hero")
    Character getHero(Episode episode);

}

4. Implement the Fetcher interface

The Fetcher interface deals with turning queries/mutations into network requests (Usually HTTP, could be websockets, etc.). For a simple example on how to do this please look at RestTemplateFetcher.java or WebClientFetcher.java.

5. Create an instance of you newly generated interface

Run build and then create an instance of the newly generated implementation.

StarWarsClient client = new StarWarsClientGraph(new RestTemplateFetcher("http://your.domain.com"));

where HttpFetcher is an implementation of the Fetcher interface. The default suffix for the implementation is Graph, and is overridable with the implSuffix parameter of the @GraphQLClient annotation.

6. Profit?

Character hero = heroclient.getHero(Episode.NEWHOPE);
log.info("My favourite Star Wars character is: {}!", hero.getName());