Introduction to GraphQL Mutation through Java


If you don’t know about GraphQL, this link is a good place to start. This article would assume that reader has basic knowledge of REST as well as Java.


Drawing comparison from REST, any verb (e.g. GET, POST, PUT etc) are able to do server changes. But as convention, we use POST to make new resource and PUT for updating resource. In an almost similar fashion, any query in GraphQL can be used for server side changes, however, we set up a convention that any server side write should be done via mutations.

Extending the example in last post, we will try to write a mutation that creates a driver(i.e. stores the firstName as well as last name) of a given car Id.

Schema Change

type Mutation {
  createDriver(id: ID!, firstName: String!, lastName: String!): 

The mutation field returns an object type which in the example shown above is Driver. As in cases of query, we can ask for nested object. This is meant to ask for updated state after the mutation.

Data Provider

We have established in our last post that every field in GraphQL has a data provider associated with it. The one for this simple mutation is not different. We have added a new type for the added mutation as shown below.

                        .dataFetcher("createDriver", graphQLDataFetchers.setDriverDataFetcher()))

The updated class should look like one below:

package com.nulpointerexception.cabdetailsgraphQLdemo;
import graphql.GraphQL;
import graphql.schema.GraphQLSchema;
import graphql.schema.idl.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.nio.charset.Charset;
public class GraphQLProvider {
public static final String SCHEMA_DEFINITION = "schema.graphqls";
private GraphQL graphQL;
public GraphQL graphQL(){
return this.graphQL;
GraphQLDataFetchers graphQLDataFetchers;
public void init() throws IOException {
URL url = Resources.getResource(SCHEMA_DEFINITION);
String sdl = Resources.toString(url, Charset.forName("UTF-8"));
GraphQLSchema graphQLSchema = buildSchema(sdl);
this.graphQL = GraphQL.newGraphQL(graphQLSchema).build();
private GraphQLSchema buildSchema(String sdl) {
TypeDefinitionRegistry typeDefinitionRegistry = new SchemaParser().parse(sdl);
RuntimeWiring runtimeWiring = buildWiring();
SchemaGenerator schemaGenerator = new SchemaGenerator();
return schemaGenerator.makeExecutableSchema(typeDefinitionRegistry, runtimeWiring);
private RuntimeWiring buildWiring() {
return RuntimeWiring.newRuntimeWiring()
.dataFetcher("cabById", graphQLDataFetchers.getCabByIdDateFetcher()))
.dataFetcher("driver", graphQLDataFetchers.getDriverDataFetcher()))
.dataFetcher("createDriver", graphQLDataFetchers.setDriverDataFetcher()))

Data Fetcher

The data fetcher for the mutation field is shown in gist below. Here, we have used a in-memory data storage but this can connect to any database or call some other API as well.

public DataFetcher setDriverDataFetcher() {
return dataFetchingEnvironment -> {
String carId = dataFetchingEnvironment.getArgument("id");
String firstName = dataFetchingEnvironment.getArgument("firstName");
String lastName = dataFetchingEnvironment.getArgument("lastName");
Map<String, String> driverDetails = new HashMap<>();
driverDetails.put("firstName", firstName);
driverDetails.put("lastName", lastName);
driverDetails.put("id", carId);
return driverDetails;

Mutation Query

mutation {
  createDriver(id: "car1", firstName: "Prathamesh", lastName: "Waghmode") {
GraphQL Playground Screenshot

Github repository

GraphQL Mutation Demo


GraphQL Java

GraphQL Official

Apollo Blog

If you liked this article and would like one such blog to land in your inbox every week, consider subscribing to our newsletter:

Leave a Reply

Up ↑

%d bloggers like this: