Minimal Implementation of graphql-kotlin

This will bring up a GraphQL endpoint at http://localhost:8080/graphql and the GraphiQL query tool at http://localhost:8080/graphiql if you run ./gradlew bootRun

build.gradle.kts

plugins {
    id("io.spring.dependency-management") version ("1.0.6.RELEASE") // Pull in dependencies automatically.
    id("org.jetbrains.kotlin.jvm") version ("1.3.10")
    id("org.jetbrains.kotlin.plugin.spring") version ("1.3.10")
    id("org.springframework.boot") version ("2.1.0.RELEASE")
}

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java).all {
    kotlinOptions {
        freeCompilerArgs = listOf("-Xjsr305=strict") // Enable strict null safety.
        jvmTarget = "1.8"
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("com.expedia.www:graphql-kotlin:0.0.23") // Generate GraphQL schema directly from code.
    implementation("com.graphql-java-kickstart:graphiql-spring-boot-starter:5.1") // Get the /graphiql page for free.
    implementation("com.graphql-java-kickstart:graphql-spring-boot-starter:5.1")
    implementation("org.springframework.boot:spring-boot-devtools")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
}

Application.kt

package {yourpackagehere}

import com.expedia.graphql.schema.SchemaGeneratorConfig
import com.expedia.graphql.TopLevelObjectDef
import com.expedia.graphql.toSchema
import com.fasterxml.jackson.module.kotlin.KotlinModule
import graphql.schema.GraphQLSchema
import graphql.schema.idl.SchemaPrinter
import graphql.servlet.GraphQLErrorHandler
import graphql.servlet.GraphQLInvocationInputFactory
import graphql.servlet.GraphQLObjectMapper
import graphql.servlet.GraphQLQueryInvoker
import graphql.servlet.ObjectMapperConfigurer
import graphql.servlet.SimpleGraphQLHttpServlet
import javax.servlet.http.HttpServlet
import org.slf4j.LoggerFactory
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.boot.web.servlet.ServletRegistrationBean
import org.springframework.context.annotation.Bean

@SpringBootApplication
class Application {
    private val logger = LoggerFactory.getLogger(Application::class.java)

    @Bean
    fun schema(): GraphQLSchema {
        val schemaConfig = SchemaGeneratorConfig(
            supportedPackages = listOf("{yourpackagehere}"),
            topLevelQueryName = "YourQuery",
            topLevelMutationName = "YourMutation"
        )

        val schema = toSchema(
            queries = listOf(TopLevelObjectDef(YourQuery())),
            mutations = emptyList(),
            config = schemaConfig
        )
        println(SchemaPrinter().print(schema))
        return schema
    }

    @Bean
    fun graphQLObjectMapper(): GraphQLObjectMapper = GraphQLObjectMapper.newBuilder()
            .withObjectMapperConfigurer(ObjectMapperConfigurer { it.registerModule(KotlinModule()) })
            .withGraphQLErrorHandler(GraphQLErrorHandler { it })
            .build()

    @Bean
    fun graphQLServlet(
        invocationInputFactory: GraphQLInvocationInputFactory,
        queryInvoker: GraphQLQueryInvoker,
        objectMapper: GraphQLObjectMapper
    ): SimpleGraphQLHttpServlet = SimpleGraphQLHttpServlet.newBuilder(invocationInputFactory)
            .withQueryInvoker(queryInvoker)
            .withObjectMapper(objectMapper)
            .build()

    @Bean
    fun graphQLServletRegistration(graphQLServlet: HttpServlet) = ServletRegistrationBean(graphQLServlet, "/graphql")
}

fun main(args: Array) {
    runApplication(*args)
}

Leave a Reply

Your email address will not be published.