graphql-client

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());