Codegen Options
| Option | Data Type | Default value | Description |
|---|---|---|---|
graphqlSchemaPaths |
List(String) | (falls back to graphqlSchemas) |
GraphQL schema locations. You can supply multiple paths to GraphQL schemas. To include many schemas from a folder hierarchy, use the graphqlSchemas block instead. |
graphqlSchemas |
See graphqlSchemas |
All.graphqls/.graphqlfiles in resources |
Block to define the input GraphQL schemas, when exact paths are too cumbersome. See table below for a list of options. See graphqlSchemas |
graphqlQueryIntrospectionResultPath |
String | None | Path to GraphQL Introspection Query result in json format (with root object __schema or data.__schema). Sample: sample-introspection-query-result.json |
outputDir |
String | None | The output target directory into which code will be generated. |
configurationFiles |
List(String) | Empty | Paths to the files with mapping configurations. Supported formats. JSON, HOCON. Order of specified configuration files matters, so the default configuration should be placed at the end. |
packageName |
String | Empty | Java package for generated classes. |
apiPackageName |
String | Empty | Java package for generated api classes (Query, Mutation, Subscription). |
modelPackageName |
String | Empty | Java package for generated model classes (type, input, interface, enum, union). |
generateBuilder |
Boolean | True | Specifies whether generated model classes should have builder. |
generateApis |
Boolean | True | Specifies whether api classes should be generated as well as model classes. |
generateDataFetchingEnvironmentArgumentInApis |
Boolean | False | If true, then graphql.schema.DataFetchingEnvironment env will be added as a last argument to all methods of root type resolvers and field resolvers. |
generateEqualsAndHashCode |
Boolean | False | Specifies whether generated model classes should have equals and hashCode methods defined. |
generateParameterizedFieldsResolvers |
Boolean | True | Specifies whether separate Resolver interface for parametrized fields should be generated. If false, then add parametrized field to the type definition and ignore field parameters. If true then separate Resolver interface for parametrized fields will be generated. |
generateImmutableModels |
Boolean | False | Specifies whether generated model classes should be immutable. |
generateToString |
Boolean | False | Specifies whether generated model classes should have toString method defined. |
generateJacksonTypeIdResolver |
Boolean | False | Specifies whether generated union interfaces should be annotated with a custom Jackson type id resolver generated in model package. |
addGeneratedAnnotation |
Boolean | True | Specifies whether generated classes should have @Generated annotation. |
generatedAnnotation |
String | jakarta.annotation.Generatedjavax.annotation.Generated |
Qualified class name (with package) of the @Generated annotation that will be added on top of every generated class (if addGeneratedAnnotation is true) |
apiNamePrefix |
String | Empty | Sets the prefix for GraphQL api classes (query, mutation, subscription). |
apiNameSuffix |
String | Resolver |
Sets the suffix for GraphQL api classes (query, mutation, subscription). |
apiInterfaceStrategy |
See ApiInterfaceStrategy |
INTERFACE_PER_OPERATION |
See ApiInterfaceStrategy |
apiRootInterfaceStrategy |
See ApiRootInterfaceStrategy |
SINGLE_INTERFACE |
See ApiRootInterfaceStrategy |
apiNamePrefixStrategy |
See ApiNamePrefixStrategy |
CONSTANT |
See ApiNamePrefixStrategy |
modelNamePrefix |
String | Empty | Sets the prefix for GraphQL model classes (type, input, interface, enum, union). |
modelNameSuffix |
String | Empty | Sets the suffix for GraphQL model classes (type, input, interface, enum, union). |
modelValidationAnnotation |
String | @javax.validation.constraints.NotNull |
Annotation for mandatory (NonNull) fields. Can be null/empty. |
typeResolverPrefix |
String | Empty | Sets the prefix for GraphQL type resolver classes. |
typeResolverSuffix |
String | Resolver |
Sets the suffix for GraphQL type resolver classes. |
customTypesMapping |
Map(String,String) | Empty | See CustomTypesMapping |
customTemplatesRoot |
File | Project’s dir | Use to supply the path the to custom FreeMarker templates root directory. |
customTemplates |
Map(String,String) | Empty | Use to supply paths to custom FreeMarker templates for code generation. |
customAnnotationsMapping |
Map(String,String[]) | Empty | See CustomAnnotationsMapping |
directiveAnnotationsMapping |
Map(String,String[]) | Empty | See DirectiveAnnotationsMapping |
fieldsWithResolvers |
Set(String) | Empty | Fields that require Resolvers should be defined here in format: TypeName.fieldName or TypeName or @directive. E.g.: Person, Person.friends, @customResolver. |
fieldsWithoutResolvers |
Set(String) | Empty | Fields that DO NOT require Resolvers should be defined here in format: TypeName.fieldName or TypeName or @directive. Can be used in conjunction with generateExtensionFieldsResolvers option. E.g.: Person, Person.friends, @noResolver. |
fieldsToExcludeFromGeneration |
Set(String) | Empty | Fields to exclude from generation should be defined here in format: TypeName.fieldName. |
resolverArgumentAnnotations |
Set(String) | Empty | Annotations that will be added to all resolver arguments. Can be used for spring-graphql inegration by supplying: org.springframework.graphql.data.method.annotation.Argument |
parametrizedResolverAnnotations |
Set(String) | Empty | Annotations that will be added to all parametrized resolver methods. Can be used for spring-graphql inegration by supplying: org.springframework.graphql.data.method.annotation.SchemaMapping(typeName="") |
generateParameterizedFieldsResolvers |
Boolean | True | If true, then generate separate Resolver interface for parametrized fields. If false, then add field to the type definition and ignore field parameters. |
generateExtensionFieldsResolvers |
Boolean | False | Specifies whether all fields in extensions (extend type and extend interface) should be present in Resolver interface instead of the type class itself. |
generateModelsForRootTypes |
Boolean | False | Specifies whether model classes should be generated for type Query, type Subscription, type Mutation. |
useOptionalForNullableReturnTypes |
Boolean | False | Specifies whether nullable return types of api methods should be wrapped into java.util.Optional<>. Lists will not be wrapped. |
useWrapperForNullableInputTypes |
Boolean | False | Specifies whether nullable parameters on input types should be wrapped into ArgumentValue<>. This requires org.springframework.graphql.data version 1.1.0+. Lists will not be wrapped. |
generateApisWithThrowsException |
Boolean | True | Specifies whether api interface methods should have throws Exception in signature. |
generateApisWithSuspendFunctions |
Boolean | False | Specifies whether api interface methods should have suspend modifier in signature. Only supported in Kotlin. |
generateNoArgsConstructorOnly |
Boolean | False | Specifies whether model classes should only have a no-args constructor. All-args constructor will not be generated in case value is true |
generateModelsWithPublicFields |
Boolean | False | Specifies whether model classes should have public fields and NO getters/setters. By default, fields are private and there are getters/setters for each field. |
apiReturnType |
String | Empty | Return type for api methods (query/mutation). For example: reactor.core.publisher.Mono, etc. |
apiReturnListType |
String | Empty | Return type for api methods (query/mutation) having list type. For example: reactor.core.publisher.Flux, etc. By default is empty, so apiReturnType will be used. |
subscriptionReturnType |
String | Empty | Return type for subscription methods. For example: org.reactivestreams.Publisher, io.reactivex.Observable, etc. |
relayConfig |
See RelayConfig |
@connection(for: ...) |
See RelayConfig |
generateClient |
Boolean | False | Specifies whether client-side classes should be generated for each query, mutation and subscription. This includes: Request classes (contain input data), ResponseProjection classes for each type (contain response fields) and Response classes (contain response data). |
requestSuffix |
String | Request | Sets the suffix for Request classes. |
responseSuffix |
String | Response | Sets the suffix for Response classes. |
responseProjectionSuffix |
String | ResponseProjection | Sets the suffix for ResponseProjection classes. |
parametrizedInputSuffix |
String | ParametrizedInput | Sets the suffix for ParametrizedInput classes. |
parentInterfaces |
See parentInterfaces |
Empty | Block to define parent interfaces for generated interfaces (query / mutation / subscription / type resolver). See parentInterfaces |
generateAllMethodInProjection |
Boolean | True | Enables whether the all$() method should be generated in the projection classes. Disabling enforces the client to select the fields manually. |
responseProjectionMaxDepth |
Integer | 3 | Sets max depth when use all$() which for facilitating the construction of projection automatically, the fields on all projections are provided when it be invoked. This is a global configuration, of course, you can use all$(max) to set for each method. For self recursive types, too big depth may result in a large number of returned data! |
generatedLanguage |
Enum | GeneratedLanguage.JAVA | Choose which language you want to generate, Java,Scala,Kotlin were supported. Note that due to language features, there are slight differences in default values between languages. |
generateModelOpenClasses |
Boolean | False | The class type of the generated model. If true, generate normal classes, else generate data classes. It only support in kotlin(data class) and scala(case class). Maybe we will consider to support Java record in the future. |
initializeNullableTypes |
Boolean | False | Adds a default null value to nullable arguments. Only supported in Kotlin. |
generateSealedInterfaces |
Boolean | False | This applies to generated interfaces on unions and interfaces. If true, generate sealed interfaces, else generate normal ones. It is only supported in Kotlin and Scala. |
typesAsInterfaces |
Set(String) | Empty | Types that must generated as interfaces should be defined here in format: TypeName or @directive. E.g.: User, @asInterface. |
fieldsWithDataFetcherResult |
Set(String) | Empty | Types that must have DataFetchResult should be defined here in format: TypeName, or TypeName.fieldName or @directive. E.g.: Item, Item.items or @dataFetcherResult. |
useObjectMapperForRequestSerialization |
Set(String) | Empty | Fields that require serialization using com.fasterxml.jackson.databind.ObjectMapper#writeValueAsString(Object). Values should be defined here in the following format: GraphqlObjectName.fieldName or GraphqlTypeName. If just type is specified, then all fields of this type will be serialized using ObjectMapper. E.g.: ["Person.createdDateTime", ZonedDateTime"] |
supportUnknownFields |
Boolean | False | Specifies whether api classes should support unknown fields during serialization or deserialization. If true, classes will include a property of type java.util.Map<String,Object> that will store unknown fields. |
unknownFieldsPropertyName |
String | userDefinedFields | Specifies the name of the property to be included in api classes to support unknown fields during serialization or deserialization |
skip |
Boolean | False | If true, then code generation will not happen |
skipSchemaSizeLimit |
Boolean | True | When set to true, the GraphQL schema will be processed with token, character, line and rule depth limits. Set to false to process the schema regardless of its size. |
Option graphqlSchemas
When exact paths to GraphQL schemas are too cumbersome to provide in the graphqlSchemaPaths, use the graphqlSchemas
block. The parameters inside that block are the following:
Key inside graphqlSchemas |
Data Type | Default value | Description |
|---|---|---|---|
rootDir |
String | Main resources dir | The root directory from which to start searching for schema files. |
recursive |
Boolean | true |
Whether to recursively look into sub directories. |
includePattern |
String | .*\.graphqls? |
A Java regex that file names must match to be included. It should be a regex as defined by the Pattern JDK class. It will be used to match only the file name without path. |
excludedFiles |
Set |
(empty set) | A set of files to exclude, even if they match the include pattern. These paths should be either absolute or relative to the provided rootDir. |
Option ApiInterfaceStrategy
Defines how to generate interfaces (resolvers) for each operation: Query/Mutation/Subscription. Provides ability
to skip generation of separate interface class for each operation in favor of having a single “root” interface (
see ApiRootInterfaceStrategy
and ApiNamePrefixStrategy)
| Value | Description |
|---|---|
INTERFACE_PER_OPERATION (default) |
Generate separate interface classes for each GraphQL operation. |
DO_NOT_GENERATE |
Do not generate separate interfaces classes for GraphQL operation. |
Option ApiRootInterfaceStrategy
Defines how root interface (QueryResolver / MutationResolver / SubscriptionResolver will be generated (in addition
to separate interfaces for each query/mutation/subscription)
| Value | Description |
|---|---|
INTERFACE_PER_SCHEMA |
Generate multiple super-interfaces for each graphql file. Takes into account apiNamePrefixStrategy. E.g.: OrderServiceQueryResolver.java, ProductServiceQueryResolver.java, etc. |
SINGLE_INTERFACE (default) |
Generate a single QueryResolver.java, MutationResolver.java, SubscriptionResolver.java for all graphql schema files. |
DO_NOT_GENERATE |
Do not generate super interface for GraphQL operations. |
Option ApiNamePrefixStrategy
Defines which prefix to use for API interfaces.
| Value | Description |
|---|---|
FILE_NAME_AS_PREFIX |
Will take GraphQL file name as a prefix for all generated API interfaces + value of apiNamePrefix config option. E.g.: * following schemas: resources/schemas/order-service.graphql, resources/schemas/product-service.graphql * will result in: OrderServiceQueryResolver.java, ProductServiceQueryResolver.java, etc |
FOLDER_NAME_AS_PREFIX |
Will take parent folder name as a prefix for all generated API interfaces + value of apiNamePrefix config option. E.g.:* following schemas: resources/order-service/schema1.graphql, resources/order-service/schema2.graphql * will result in: OrderServiceQueryResolver.java, OrderServiceGetOrderByIdQueryResolver.java, etc |
CONSTANT (default) |
Will take only the value of apiNamePrefix config option. |
resources/schemas/order-service.graphql, *
resources/schemas/product-service.graphql
* will result in: OrderServiceQueryResolver.java
, ProductServiceQueryResolver.java, etc | | FOLDER_NAME_AS_PREFIX | Will take parent folder name as a prefix for
all generated API interfaces + value of apiNamePrefix config option. E.g.:
* following schemas: *
resources/order-service/schema1.graphql, *
resources/order-service/schema2.graphql
* will result in: OrderServiceQueryResolver.java
, OrderServiceGetOrderByIdQueryResolver.java, etc | | CONSTANT (default) | Will take only the value
of apiNamePrefix config option. |
Option parentInterfaces
Following options can be defined if you want generated resolvers to extend certain interfaces. Can be handy if you are using graphql-java-tools and want your resolver classes to extend only interfaces generated by this plugin.
Note: if you want to include a GraphQL type name into the interface name, then use `` placeholder.
E.g.: graphql.kickstart.tools.GraphQLResolver<>
Key inside parentInterfaces |
Data Type | Default value | Description |
|---|---|---|---|
queryResolver |
String | Empty | Interface that will be added as “extend” to all generated api Query interfaces. |
mutationResolver |
String | Empty | Interface that will be added as “extend” to all generated api Mutation interfaces. |
subscriptionResolver |
String | Empty | Interface that will be added as “extend” to all generated api Subscription interfaces. |
resolver |
String | Empty | Interface that will be added as “extend” to all generated TypeResolver interfaces. |
Option customTypesMapping
Can be used to supply custom mappings for scalars.
Supports following formats:
- Map of (GraphQLObjectName.fieldName) to (JavaType). E.g.:
Event.dateTime = java.util.Date - Map of (GraphQLType) to (JavaType). E.g.:
EpochMillis = java.time.LocalDateTime
Option customAnnotationsMapping
Can be used to supply custom annotations (serializers) for scalars.
@ in front of the annotation class is optional.
Supports following formats:
- Map of (GraphQLObjectName.fieldName) to (JavaAnnotation).
E.g.:
Event.dateTime = @com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.DateDeserializer.class) - Map of (GraphQLType) to (JavaAnnotation).
E.g.:
EpochMillis = @com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.EpochMillisDeserializer.class)
Option directiveAnnotationsMapping
Can be used to supply custom annotations for directives in a following format:
Map of (GraphQL.directiveName) to (JavaAnnotation).
E.g.: auth = @org.springframework.security.access.annotation.Secured().
@ in front of the annotation class is optional.
Note: In order to supply the value of directive argument to annotation, use placeholder . You
can also use one of the formatters for directive argument value:,
,.
Option relayConfig
Can be used to supply a custom configuration for Relay support. For reference see: https://www.graphql-java-kickstart.com/tools/relay/
Key inside relayConfig |
Data Type | Default value | Description |
|---|---|---|---|
directiveName |
String | connection |
Directive name used for marking a field. |
directiveArgumentName |
String | for |
Directive argument name that contains a GraphQL type name. |
connectionType |
String | graphql.relay.Connection |
Generic Connection type. |
For example, the following schema:
type Query { users(first: Int, after: String): UserConnection @connection(for: "User") }
will result in generating the interface with the following method:
graphql.relay.Connection<User> users(Integer first, String after) throws Exception;
External mapping configuration
Provide a path to external file via property configurationFiles
Sample content of the file:
JSON:
{
"generateApis": true,
"packageName": "com.kobylynskyi.graphql.testconfigjson",
"customTypesMapping": {
"Price.amount": "java.math.BigDecimal"
}
}
generateClient=true
generateApis=true
generateBuilder=true
generateImmutableModels=true
generateToString=true
generateEqualsAndHashCode=true
apiPackageName="io.github.graphql.j.resolver"
modelPackageName="io.github.graphql.j.model"
modelNameSuffix="TO"
apiInterfaceStrategy="DO_NOT_GENERATE"
apiRootInterfaceStrategy="SINGLE_INTERFACE"
generateModelsForRootTypes=true
apiNamePrefix="GitHub"
addGeneratedAnnotation=false
generatedLanguage="KOTLIN"
customTypesMapping={
Long="Long",
Object="org.json.JSONObject"
}
customAnnotationsMapping={
"QuestionNode.metaData"=["com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.github.dreamylost.JsonObjectDeserializer::class)"]
"QuestionNode.envInfo"=["com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.github.dreamylost.JsonObjectDeserializer::class)"]
}