Building Custom Directives
Create your own schema directives to add custom logic, validation, or transformation to your GraphQL fields.
Building Custom Directives is a free GraphQL APIs with Spring Boot lesson on CoddyKit — lesson 1 of 4. You can read the complete lesson below for free — then practise it hands-on in the browser with a built-in code editor and a 24/7 AI tutor. It is part of the GraphQL APIs with Spring Boot learning path, one of 4 lessons in the course, and your progress syncs across the web and the CoddyKit app.
Directives: Extending GraphQL
GraphQL directives are powerful tools that allow you to add custom behavior or metadata to your schema. You might already know built-in directives like @deprecated or @skip.
Custom directives let you define your own, extending GraphQL's capabilities to fit your unique application needs.
Power of Custom Directives
Custom directives offer several benefits:
- Reusability: Apply the same logic across multiple fields or types without repeating code.
- Separation of Concerns: Keep business logic separate from schema definitions.
- Cross-Cutting Concerns: Easily add features like logging, authorization, or validation to many parts of your API.
Declaring Your Directive
You define a custom directive using the directive keyword in your Schema Definition Language (SDL).
It specifies the directive's name, arguments (optional), and the locations where it can be applied.
directive @log(message: String = "Access") on FIELD_DEFINITION | FIELDUnderstanding Directive Locations
The on keyword specifies where your directive can be used. Common locations include:
FIELD_DEFINITION: On a field within a type (e.g.,User.name).FIELD: On a field in a query document (client-side).ARGUMENT_DEFINITION: On an argument of a field or input field.OBJECT: On an object type.
Implementing Directive Logic
To make your custom directive do something, you need to "wire" it to your Spring Boot application. This involves telling graphql-java how to handle the directive when it encounters it in the schema.
We'll use SchemaDirectiveWiring to intercept and modify field resolution.
Example: The @log Directive
Let's create a @log directive that prints a message whenever a field it's applied to is resolved. This is a great way to see directives in action.
First, our schema definition:
type Query {
hello: String @log(message: "Hello field accessed")
goodbye: String
}
directive @log(message: String = "Default Log") on FIELD_DEFINITIONWiring the @log Directive (Part 1)
In Spring Boot, you implement SchemaDirectiveWiring and register it. This class will contain the logic to execute when the directive is found.
We'll focus on onField to intercept field resolution.
package com.coddykit.directives;
import graphql.schema.DataFetcher;
import graphql.schema.DataFetcherFactories;
import graphql.schema.GraphQLFieldDefinition;
import graphql.schema.idl.SchemaDirectiveWiring;
import graphql.schema.idl.SchemaDirectiveWiringEnvironment;
import org.springframework.stereotype.Component;
@Component
public class LogDirective implements SchemaDirectiveWiring {
@Override
public GraphQLFieldDefinition onField(
SchemaDirectiveWiringEnvironment<GraphQLFieldDefinition> environment) {
GraphQLFieldDefinition field = environment.getElement();
String message = (String) environment.getDirective()
.getArgument("message")
.getValue();
DataFetcher originalDataFetcher = environment.getFieldDataFetcher();
DataFetcher newDataFetcher = DataFetcherFactories
.wrapDataFetcher(originalDataFetcher, (dataFetchingEnvironment, value) -> {
System.out.println("LOG: " + message + " for field '" + field.getName() + "'");
return value;
});
environment.getFieldAndContainer().setDataFetcher(newDataFetcher);
return field;
}
}Wiring the @log Directive (Part 2)
To ensure our LogDirective is picked up, we need a main application and a resolver. Here's how it all fits together, including a simple data fetcher for our hello field.
Notice how RuntimeWiringConfigurer is used to register directive wirings.
package com.coddykit;
import com.coddykit.directives.LogDirective;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.graphql.execution.RuntimeWiringConfigurer;
import org.springframework.stereotype.Controller;
import org.springframework.graphql.data.method.annotation.QueryMapping;
@SpringBootApplication
@Controller
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
@QueryMapping
public String hello() {
return "Hello from CoddyKit!";
}
// This bean registers our custom directive wiring
@Bean
public RuntimeWiringConfigurer runtimeWiringConfigurer(LogDirective logDirective) {
return builder -> builder.directive("log", logDirective);
}
}
// For this application to run, the LogDirective class (from Scene 7)
// must be present in 'com.coddykit.directives' package.Testing the Directive
With the application running, send a GraphQL query like this:
When you query the hello field, you'll see "LOG: Hello field accessed for field 'hello'" printed in your server console, demonstrating our custom directive in action!
query {
hello
}Quick Check: Directive Power
You've seen how custom directives add logic to your GraphQL schema. Which of the following best describes a primary benefit of using custom directives?
Recap: Building Directives
In this lesson, you learned to define and implement custom GraphQL directives in a Spring Boot application. We covered:
- Declaring directives in SDL with
on LOCATION. - Implementing directive logic using
SchemaDirectiveWiring. - Applying a directive to modify field behavior, like our
@logexample.
Custom directives are powerful for adding reusable, cross-cutting concerns to your API.
Frequently asked questions
Is the “Building Custom Directives” lesson free?
Yes — the full text of “Building Custom Directives” is free to read here on the web, and the GraphQL APIs with Spring Boot course includes 4 lessons in total. To practise it interactively (a built-in code editor and a 24/7 AI tutor) and unlock the rest of the GraphQL APIs with Spring Boot course, upgrade to CoddyKit PRO.
What will I learn in “Building Custom Directives”?
Create your own schema directives to add custom logic, validation, or transformation to your GraphQL fields. You practise GraphQL APIs with Spring Boot with hands-on code you run directly in the browser, and a 24/7 AI tutor answers your questions as you work through the lesson.
Do I need any experience to start GraphQL APIs with Spring Boot?
No prior experience is required. GraphQL APIs with Spring Boot on CoddyKit is structured for beginners through advanced learners; this is — lesson 1 of 4, so you can start here or from the beginning and move at your own pace.
How long does the “Building Custom Directives” lesson take?
Most CoddyKit lessons take about 5–10 minutes. Each one is bite-sized and interactive, so you make steady progress and pick up exactly where you left off across the web and the app.
Can I write and run code in this GraphQL APIs with Spring Boot lesson?
Yes. Every GraphQL APIs with Spring Boot lesson includes a built-in code editor, so you write and run real code right in your browser and get instant AI feedback — no local setup required.
All lessons in this course
- Building Custom Directives
- Schema Stitching Fundamentals
- Merging Multiple GraphQL Schemas
- Schema Modularization with Type Extensions