Client Serialization
GraphQL Kotlin build plugins can generate GraphQL client data classes that are compatible with Jackson
(default) or kotlinx.serialization data models. By default, GraphQL
clients will attempt to pick up the appropriate serializer from a classpath - graphql-kotlin-spring-client defines implicit
dependency on Jackson based serializer and graphql-kotlin-ktor-client define a dependency on a kotlinx.serialization.
GraphQLClientSerializer is a service provider interface that expose generic serialize/deserialize methods that are used
by the GraphQL clients to serialize requests to String and deserialize responses from String. By utilizing Java ServiceLoader
mechanism we can dynamically load appropriate serializer from the classpath. If there are multiple providers on the classpath,
we default to select the first one available one on the classpath.
GraphQL Kotlin Spring Client
Using Jackson
Jackson is the default serializer used by the build plugins and by GraphQL Kotlin Spring Client.
- Gradle
- Maven
// build.gradle.kts
import com.expediagroup.graphql.plugin.gradle.graphql
dependencies {
implementation("com.expediagroup", "graphql-kotlin-spring-client", $graphQLKotlinVersion) {
}
graphql {
client {
endpoint = "http://localhost:8080/graphql"
packageName = "com.example.generated"
}
}
<project>
<!-- other elements omitted for brewity -->
<dependencies>
<dependency>
<groupId>com.expediagroup</groupId>
<artifactId>graphql-kotlin-spring-client</artifactId>
<version>${graphql-kotlin.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- other plugins omitted for clarity -->
<plugin>
<groupId>com.expediagroup</groupId>
<artifactId>graphql-kotlin-maven-plugin</artifactId>
<version>${graphql-kotlin.version}</version>
<executions>
<execution>
<goals>
<goal>introspect-schema</goal>
<goal>generate-client</goal>
</goals>
<configuration>
<endpoint>http://localhost:8080/graphql</endpoint>
<packageName>com.example.generated</packageName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
By default, ServiceLoader mechanism will load the first available GraphQL client serializer from the classpath.
val client = GraphQLWebClient(
url = "http://localhost:8080/graphql"
serializer = GraphQLClientJacksonSerializer()
)
Using Kotlinx Serialization
In order to use kotlinx.serialization we need to
- add dependency on
graphql-kotlin-client-serialization - configure GraphQL plugin to generate
kotlinx.serializationcompatible data models - configure corresponding compiler plugin
- explicitly specify the target serializer during client construction OR exclude
graphql-kotlin-client-jacksondependency
- Gradle
- Maven
// build.gradle.kts
import com.expediagroup.graphql.plugin.gradle.config.GraphQLSerializer
import com.expediagroup.graphql.plugin.gradle.graphql
plugins {
kotlin("plugin.serialization") version $kotlinVersion
}
dependencies {
implementation("com.expediagroup", "graphql-kotlin-spring-client", $graphQLKotlinVersion) {
exclude("com.expediagroup", "graphql-kotlin-client-jackson")
}
implementation("com.expediagroup", "graphql-kotlin-client-serialization", $graphQLKotlinVersion)
}
graphql {
client {
endpoint = "http://localhost:8080/graphql"
packageName = "com.example.generated"
serializer = GraphQLSerializer.KOTLINX
}
}
<project>
<!-- other elements omitted for brewity -->
<dependencies>
<dependency>
<groupId>com.expediagroup</groupId>
<artifactId>graphql-kotlin-spring-client</artifactId>
<version>${graphql-kotlin.version}</version>
<exclusions>
<exclusion>
<groupId>com.expediagroup</groupId>
<artifactId>graphql-kotlin-client-jackson</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.expediagroup</groupId>
<artifactId>graphql-kotlin-client-serialization</artifactId>
<version>${graphql-kotlin.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlinx</groupId>
<artifactId>kotlinx-serialization-json</artifactId>
<version>${kotlinx-serialization.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- other plugins omitted for clarity -->
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<configuration>
<jvmTarget>1.8</jvmTarget>
<compilerPlugins>
<plugin>kotlinx-serialization</plugin>
</compilerPlugins>
</configuration>
<executions>
<execution>
<id>compile</id>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-serialization</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>com.expediagroup</groupId>
<artifactId>graphql-kotlin-maven-plugin</artifactId>
<version>${graphql-kotlin.version}</version>
<executions>
<execution>
<goals>
<goal>introspect-schema</goal>
<goal>generate-client</goal>
</goals>
<configuration>
<endpoint>http://localhost:8080/graphql</endpoint>
<packageName>com.example.generated</packageName>
<serializer>KOTLINX</serializer>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
By default, ServiceLoader mechanism will load the first available GraphQL client serializer from the classpath. We can
also explicitly specify serializer during client construction
val client = GraphQLWebClient(
url = "http://localhost:8080/graphql"
serializer = GraphQLClientKotlinxSerializer()
)
GraphQL Kotlin Ktor Client
Using Kotlinx Serialization
kotlinx.serialization is the default serializer used by the GraphQL Kotlin Ktor Client. Build plugins default to use
Jackson so we have to explicitly configure the tasks/mojos to use appropriate serializer.
- Gradle
- Maven
// build.gradle.kts
import com.expediagroup.graphql.plugin.gradle.config.GraphQLSerializer
import com.expediagroup.graphql.plugin.gradle.graphql
plugins {
kotlin("plugin.serialization") version $kotlinVersion
}
dependencies {
implementation("com.expediagroup", "graphql-kotlin-ktor-client", $graphQLKotlinVersion) {
}
graphql {
client {
endpoint = "http://localhost:8080/graphql"
packageName = "com.example.generated"
serializer = GraphQLSerializer.KOTLINX
}
}
<project>
<!-- other elements omitted for brewity -->
<dependencies>
<dependency>
<groupId>com.expediagroup</groupId>
<artifactId>graphql-kotlin-ktor-client</artifactId>
<version>${graphql-kotlin.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlinx</groupId>
<artifactId>kotlinx-serialization-json</artifactId>
<version>${kotlinx-serialization.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- other plugins omitted for clarity -->
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<configuration>
<jvmTarget>1.8</jvmTarget>
<compilerPlugins>
<plugin>kotlinx-serialization</plugin>
</compilerPlugins>
</configuration>
<executions>
<execution>
<id>compile</id>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-serialization</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>com.expediagroup</groupId>
<artifactId>graphql-kotlin-maven-plugin</artifactId>
<version>${graphql-kotlin.version}</version>
<executions>
<execution>
<goals>
<goal>introspect-schema</goal>
<goal>generate-client</goal>
</goals>
<configuration>
<endpoint>http://localhost:8080/graphql</endpoint>
<packageName>com.example.generated</packageName>
<serializer>KOTLINX</serializer>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
By default, ServiceLoader mechanism will load the first available GraphQL client serializer from the classpath.
val client = GraphQLKtorClient(
url = URL("http://localhost:8080/graphql")
serializer = GraphQLClientKotlinxSerializer()
)
Using Jackson
In order to use Jackson we need to
- add dependency on
graphql-kotlin-client-jackson - explicitly specify the target serializer during client construction OR exclude
graphql-kotlin-client-serializationdependency
- Gradle
- Maven
// build.gradle.kts
import com.expediagroup.graphql.plugin.gradle.graphql
dependencies {
implementation("com.expediagroup", "graphql-kotlin-ktor-client", $graphQLKotlinVersion) {
exclude("com.expediagroup", "graphql-kotlin-client-serialization")
}
implementation("com.expediagroup", "graphql-kotlin-client-jackson", $graphQLKotlinVersion)
}
graphql {
client {
endpoint = "http://localhost:8080/graphql"
packageName = "com.example.generated"
}
}
<project>
<!-- other elements omitted for brewity -->
<dependencies>
<dependency>
<groupId>com.expediagroup</groupId>
<artifactId>graphql-kotlin-ktor-client</artifactId>
<version>${graphql-kotlin.version}</version>
<exclusions>
<exclusion>
<groupId>com.expediagroup</groupId>
<artifactId>graphql-kotlin-client-serialization</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.expediagroup</groupId>
<artifactId>graphql-kotlin-client-jackson</artifactId>
<version>${graphql-kotlin.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- other plugins omitted for clarity -->
<plugin>
<groupId>com.expediagroup</groupId>
<artifactId>graphql-kotlin-maven-plugin</artifactId>
<version>${graphql-kotlin.version}</version>
<executions>
<execution>
<goals>
<goal>introspect-schema</goal>
<goal>generate-client</goal>
</goals>
<configuration>
<endpoint>http://localhost:8080/graphql</endpoint>
<packageName>com.example.generated</packageName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
By default, ServiceLoader mechanism will load the first available GraphQL client serializer from the classpath. We can
also explicitly specify serializer during client construction
val client = GraphQLKtorClient(
url = URL("http://localhost:8080/graphql")
serializer = GraphQLClientJacksonSerializer()
)