<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>GraphQL Java Kickstart</title><link>https://graphql-java-kickstart.github.io/</link><description>Recent content on GraphQL Java Kickstart</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 17 May 2021 07:00:00 -0500</lastBuildDate><atom:link href="https://graphql-java-kickstart.github.io/index.xml" rel="self" type="application/rss+xml"/><item><title>Getting started</title><link>https://graphql-java-kickstart.github.io/servlet/getting-started/</link><pubDate>Wed, 07 Nov 2018 00:11:02 +0100</pubDate><guid>https://graphql-java-kickstart.github.io/servlet/getting-started/</guid><description>&lt;p&gt;A working version of this example can be found at &lt;a href="https://github.com/graphql-java-kickstart/samples/tree/master/servlet-hello-world"&gt;https://github.com/graphql-java-kickstart/samples/tree/master/servlet-hello-world&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="build-with-gradle"&gt;Build with Gradle&lt;/h2&gt;&#10;&lt;p&gt;First you set up a basic build script. You can use any build system you like, but the code you need to work with&#10;Gradle and Maven is included here.&lt;/p&gt;&#10;&lt;h3 id="create-a-gradle-build-file"&gt;Create a Gradle build file&lt;/h3&gt;&#10;&lt;p&gt;Make sure &lt;code&gt;mavenCentral&lt;/code&gt; is among your repositories. The example build script below uses &lt;code&gt;org.gretty&lt;/code&gt; to provide&#10;a webserver to show a working example.&lt;/p&gt;</description></item><item><title>Getting started</title><link>https://graphql-java-kickstart.github.io/spring-boot/getting-started/</link><pubDate>Wed, 07 Nov 2018 00:11:02 +0100</pubDate><guid>https://graphql-java-kickstart.github.io/spring-boot/getting-started/</guid><description>&lt;p&gt;This project requires at least the following version:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Java 17&lt;/li&gt;&#10;&lt;li&gt;Spring Boot 3.x.x (&lt;code&gt;spring-boot-starter-web&lt;/code&gt;)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="quick-start"&gt;Quick start&lt;/h2&gt;&#10;&lt;p&gt;To add &lt;code&gt;graphql-spring-boot&lt;/code&gt; to your project and get started quickly, do the following.&lt;/p&gt;&#10;&lt;h3 id="build-with-gradle"&gt;Build with Gradle&lt;/h3&gt;&#10;&lt;p&gt;Make sure &lt;code&gt;mavenCentral&lt;/code&gt; is amongst your repositories:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gradle" data-lang="gradle"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;repositories &lt;span style="color:#f92672"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mavenCentral&lt;span style="color:#f92672"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add the respective starter dependencies you want to use:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gradle" data-lang="gradle"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dependencies &lt;span style="color:#f92672"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; implementation &lt;span style="color:#e6db74"&gt;&amp;#39;com.graphql-java-kickstart:graphql-spring-boot-starter:15.0.0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// testing facilities&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; testImplementation &lt;span style="color:#e6db74"&gt;&amp;#39;com.graphql-java-kickstart:graphql-spring-boot-starter-test:15.0.0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="build-with-maven"&gt;Build with Maven&lt;/h3&gt;&#10;&lt;p&gt;Add the respective starter dependencies you want to use:&lt;/p&gt;</description></item><item><title>Getting started</title><link>https://graphql-java-kickstart.github.io/tools/getting-started/</link><pubDate>Wed, 07 Nov 2018 00:11:02 +0100</pubDate><guid>https://graphql-java-kickstart.github.io/tools/getting-started/</guid><description>&lt;p&gt;A working &lt;a href="https://github.com/graphql-java-kickstart/samples/tree/master/tools-hello-world"&gt;Java Spring-Boot application&lt;/a&gt; is provided,&#10;based off the &lt;a href="https://github.com/graphql-java/graphql-java/blob/master/src/test/groovy/graphql/StarWarsSchema.java"&gt;Star Wars API&lt;/a&gt; tests&#10;and &lt;a href="https://github.com/graphql-java/graphql-java/blob/master/src/test/groovy/graphql/StarWarsData.groovy"&gt;test data&lt;/a&gt;.&#10;If you&amp;rsquo;re using Spring Boot, check out the &lt;a href="https://github.com/graphql-java-kickstart/graphql-spring-boot"&gt;graphql-spring-boot-starter&lt;/a&gt;!&lt;/p&gt;&#10;&lt;p&gt;A working &lt;a href="https://github.com/graphql-java-kickstart/graphql-java-tools/blob/master/src/test/kotlin/graphql/kickstart/tools/EndToEndSpecHelper.kt"&gt;Kotlin example&lt;/a&gt; can be found in the tests.&lt;/p&gt;&#10;&lt;h2 id="quick-start"&gt;Quick start&lt;/h2&gt;&#10;&lt;p&gt;To add &lt;code&gt;graphql-java-tools&lt;/code&gt; to your project and get started quickly, do the following.&lt;/p&gt;&#10;&lt;p&gt;Version 15 needs Java 17, graphql-java 26 and Jackson 3. graphql-spring-boot-starter is archived and doesn&amp;rsquo;t work with it, so stay on 14.5.0 with the starter.&lt;/p&gt;</description></item><item><title>Dataloaders</title><link>https://graphql-java-kickstart.github.io/servlet/dataloaders/</link><pubDate>Wed, 07 Nov 2018 00:11:02 +0100</pubDate><guid>https://graphql-java-kickstart.github.io/servlet/dataloaders/</guid><description>&lt;p&gt;It is possible to create context, and consequently dataloaders, in both a request scope and a per query scope by&#10;customizing &lt;a href="https://github.com/graphql-java-kickstart/graphql-java-servlet/blob/master/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLContextBuilder.java"&gt;GraphQLContextBuilder&lt;/a&gt;&#10;and selecting the appropriate &lt;a href="https://github.com/graphql-java-kickstart/graphql-java-servlet/blob/master/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/ContextSetting.java"&gt;ContextSetting&lt;/a&gt;&#10;with the provided &lt;a href="https://github.com/graphql-java-kickstart/graphql-java-servlet/blob/master/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLConfiguration.java"&gt;GraphQLConfiguration&lt;/a&gt;.&#10;A new &lt;a href="https://github.com/graphql-java/java-dataloader/blob/master/src/main/java/org/dataloader/DataLoaderRegistry.java"&gt;DataLoaderRegistry&lt;/a&gt; should be created in each call to the GraphQLContextBuilder, and the servlet will call the builder at the appropriate times.&#10;For example:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CustomGraphQLContextBuilder&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;implements&lt;/span&gt; GraphQLServletContextBuilder {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; DataLoader userDataLoader;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CustomGraphQLContextBuilder&lt;/span&gt;(DataLoader userDataLoader) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;userDataLoader&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; userDataLoader;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; GraphQLContext &lt;span style="color:#a6e22e"&gt;build&lt;/span&gt;() {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; DefaultGraphQLContext();&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; GraphQLContext &lt;span style="color:#a6e22e"&gt;build&lt;/span&gt;(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; DefaultGraphQLServletContext.&lt;span style="color:#a6e22e"&gt;createServletContext&lt;/span&gt;()&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;with&lt;/span&gt;(httpServletRequest)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;with&lt;/span&gt;(httpServletResponse)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;with&lt;/span&gt;(buildDataLoaderRegistry())&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;build&lt;/span&gt;();&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; GraphQLContext &lt;span style="color:#a6e22e"&gt;build&lt;/span&gt;(Session session, HandshakeRequest handshakeRequest) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; DefaultGraphQLWebSocketContext.&lt;span style="color:#a6e22e"&gt;createWebSocketContext&lt;/span&gt;()&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;with&lt;/span&gt;(session)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;with&lt;/span&gt;(handshakeRequest)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;with&lt;/span&gt;(buildDataLoaderRegistry())&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;build&lt;/span&gt;();&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; DataLoaderRegistry &lt;span style="color:#a6e22e"&gt;buildDataLoaderRegistry&lt;/span&gt;() {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DataLoaderRegistry registry &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; DataLoaderRegistry();&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; registry.&lt;span style="color:#a6e22e"&gt;register&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;userDataLoader&amp;#34;&lt;/span&gt;, userDataLoader);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; registry;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It is then possible to access the &lt;a href="https://github.com/graphql-java/java-dataloader/blob/master/src/main/java/org/dataloader/DataLoader.java"&gt;DataLoader&lt;/a&gt;&#10;in the resolvers by accessing the &lt;a href="https://github.com/graphql-java/java-dataloader/blob/master/src/main/java/org/dataloader/DataLoaderRegistry.java"&gt;DataLoaderRegistry&lt;/a&gt; from context. For example:&lt;/p&gt;</description></item><item><title>Defining a schema</title><link>https://graphql-java-kickstart.github.io/tools/schema-definition/</link><pubDate>Wed, 07 Nov 2018 00:11:02 +0100</pubDate><guid>https://graphql-java-kickstart.github.io/tools/schema-definition/</guid><description>&lt;p&gt;A &lt;a href="http://graphql.org/learn/schema/"&gt;GraphQL schema&lt;/a&gt; can be given either as raw strings:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// My application class&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SchemaParser.&lt;span style="color:#a6e22e"&gt;newParser&lt;/span&gt;()&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;schemaString&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Query { }&amp;#34;&lt;/span&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;or as files on the classpath:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// My application class&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SchemaParser.&lt;span style="color:#a6e22e"&gt;newParser&lt;/span&gt;()&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;file&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;my-schema.graphqls&amp;#34;&lt;/span&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// my-schema.graphqls&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Query { }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Multiple sources will be concatenated together in the order given, allowing you to modularize your schema if desired.&#10;Line numbers in syntax errors count from the start of each file or string, and errors in a file end with its name. To name a schema string too, pass the name as well:&lt;/p&gt;</description></item><item><title>Servlet Listener</title><link>https://graphql-java-kickstart.github.io/servlet/servlet-listener/</link><pubDate>Fri, 15 May 2020 09:28:02 +0100</pubDate><guid>https://graphql-java-kickstart.github.io/servlet/servlet-listener/</guid><description>&lt;p&gt;The GraphQL Servlet library allows you to add a &lt;a href="https://github.com/graphql-java-kickstart/graphql-java-servlet/blob/master/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/core/GraphQLServletListener.java"&gt;Servlet Listener&lt;/a&gt;&#10;for listening to the GraphQL request. It provides hooks into the servlet request execution (success, error, and finally):&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MyServlet&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; GraphQLHttpServlet {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;protected&lt;/span&gt; GraphQLConfiguration &lt;span style="color:#a6e22e"&gt;getConfiguration&lt;/span&gt;() {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; GraphQLConfiguration.&lt;span style="color:#a6e22e"&gt;with&lt;/span&gt;(createSchema())&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;with&lt;/span&gt;(queryInvoker)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;with&lt;/span&gt;(Arrays.&lt;span style="color:#a6e22e"&gt;asList&lt;/span&gt;(listener))&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;build&lt;/span&gt;();&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="instrumentation"&gt;Instrumentation&lt;/h2&gt;&#10;&lt;p&gt;The Servlet Listener listens to the servlet request, but not to the GraphQL query execution.&#10;If you want to listen to that you should use the &lt;a href="https://www.graphql-java.com/documentation/v16/instrumentation/"&gt;Instrumentation&lt;/a&gt;&#10;provided by GraphQL Java. You can extend &lt;a href="https://github.com/graphql-java/graphql-java/blob/master/src/main/java/graphql/execution/instrumentation/SimpleInstrumentation.java"&gt;SimpleInstrumentation&lt;/a&gt;&#10;to quickly create a custom implementation and use it when creating the &lt;code&gt;GraphQLConfiguration&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Schema parser options</title><link>https://graphql-java-kickstart.github.io/tools/schema-parser-options/</link><pubDate>Wed, 07 Nov 2018 00:11:02 +0100</pubDate><guid>https://graphql-java-kickstart.github.io/tools/schema-parser-options/</guid><description>&lt;p&gt;For advanced use-cases, the schema parser can be tweaked to suit your needs.&#10;Use &lt;code&gt;SchemaParserOptions.newBuilder()&lt;/code&gt; to build an options object to pass to the parser.&lt;/p&gt;&#10;&lt;p&gt;Options:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;contextClass&lt;/code&gt;: If you use a custom context object to execute your queries, let the parser know about it so that it can add it to data fetchers as an argument.&lt;br&gt;&#10;Make sure to also provide your context instance to the execution input:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; executionInput &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ExecutionInput.&lt;span style="color:#a6e22e"&gt;newExecutionInput&lt;/span&gt;()&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;query&lt;/span&gt;(query)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;variables&lt;/span&gt;(variables)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;graphQLContext&lt;/span&gt;(Map.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(CustomContext.&lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;, context));&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;genericWrappers&lt;/code&gt;: Allows defining your own generic classes that should be unwrapped when matching Java types to GraphQL types. You must supply the class and the index (zero-indexed) of the wrapped generic type. For example: If you want to unwrap type argument &lt;code&gt;T&lt;/code&gt; of &lt;code&gt;Future&amp;lt;T&amp;gt;&lt;/code&gt;, you must pass &lt;code&gt;Future.class&lt;/code&gt; and &lt;code&gt;0&lt;/code&gt;.&#10;Use &lt;code&gt;GenericWrapper.withTransformer&lt;/code&gt; to also convert the value at runtime. If the transformer returns &lt;code&gt;null&lt;/code&gt;, the field is &lt;code&gt;null&lt;/code&gt;.&#10;If the transformer returns a future of the wrapper&amp;rsquo;s content, such as Reactor&amp;rsquo;s &lt;code&gt;Mono::toFuture&lt;/code&gt;, register it with &lt;code&gt;GenericWrapper.withCompletionStageTransformer(Mono.class, 0, Mono::toFuture)&lt;/code&gt; instead. A future declared inside the wrapper, like &lt;code&gt;Mono&amp;lt;CompletableFuture&amp;lt;Item&amp;gt;&amp;gt;&lt;/code&gt;, is then waited on too. With &lt;code&gt;withTransformer&lt;/code&gt;, graphql-java gets that inner future as the value.&#10;Wrappers and futures nested in lists or in other wrappers are unwrapped too, e.g. &lt;code&gt;List&amp;lt;Try&amp;lt;Payload&amp;gt;&amp;gt;&lt;/code&gt; or &lt;code&gt;List&amp;lt;CompletableFuture&amp;lt;Item&amp;gt;&amp;gt;&lt;/code&gt;. If one element fails, the whole field fails.&#10;A transformer or nested future that calls a DataLoader after an async step needs graphql-java&amp;rsquo;s DataLoader chaining (&lt;code&gt;DataLoaderDispatchingContextKeys.setEnableDataLoaderChaining&lt;/code&gt;), otherwise the field never completes.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;useDefaultGenericWrappers&lt;/code&gt;: Defaults to &lt;code&gt;true&lt;/code&gt;. Tells the parser whether or not to add it&amp;rsquo;s own list of well-known generic wrappers, such as &lt;code&gt;Future&lt;/code&gt; and &lt;code&gt;CompletableFuture&lt;/code&gt;.&#10;graphql-java only waits on a &lt;code&gt;CompletionStage&lt;/code&gt;, so a method declared to return a &lt;code&gt;Future&lt;/code&gt; has to return one, such as a &lt;code&gt;CompletableFuture&lt;/code&gt;. Any other future fails the field with an error, unless a generic wrapper transformer converts it.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;allowUnimplementedResolvers&lt;/code&gt;: Defaults to &lt;code&gt;false&lt;/code&gt;. Allows a schema to be created even if not all GraphQL fields have resolvers. Intended only for development, it will log a warning to remind you to turn it off for production. Any unimplemented resolvers will throw errors when queried.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;missingResolverDataFetcherProvider&lt;/code&gt;: Allows you to provide custom behavior for missing GraphQL fields. It gets the field definition and the options, and returns the &lt;code&gt;DataFetcher&lt;/code&gt; for that field, e.g. &lt;code&gt;.missingResolverDataFetcherProvider { field, options -&amp;gt; fetcher }&lt;/code&gt;.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;inputArgumentOptionalDetectOmission&lt;/code&gt;: Defaults to &lt;code&gt;false&lt;/code&gt;. By default, the parser will treat omitted or null method input arguments as &lt;code&gt;Optional.empty&lt;/code&gt; in resolvers. If you prefer, you can disable this behavior.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;objectMapperConfigurer&lt;/code&gt; / &lt;code&gt;objectMapperProvider&lt;/code&gt;: The Jackson &lt;code&gt;ObjectMapper&lt;/code&gt; that converts the arguments of method resolvers. It&amp;rsquo;s a Jackson 3 mapper (&lt;code&gt;tools.jackson&lt;/code&gt;).&#10;By default all fields share one mapper with the Kotlin module, which fails on unknown properties and converts enums to and from Strings by &lt;code&gt;name()&lt;/code&gt;.&#10;&lt;code&gt;objectMapperConfigurer&lt;/code&gt; customizes that mapper per field, and can do it differently based on the GraphQL field definition. It gets the mapper&amp;rsquo;s &lt;code&gt;JsonMapper.Builder&lt;/code&gt;, e.g. &lt;code&gt;.objectMapperConfigurer { builder, context -&amp;gt; builder.addModule(MyModule()) }&lt;/code&gt;, and a module added there replaces the library&amp;rsquo;s module of the same type.&#10;&lt;code&gt;objectMapperProvider&lt;/code&gt; uses your own mappers as they are, e.g. &lt;code&gt;.objectMapperProvider(field -&amp;gt; springMapper)&lt;/code&gt; to share a Spring Boot 4 app&amp;rsquo;s &lt;code&gt;JsonMapper&lt;/code&gt;.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;preferGraphQLResolver&lt;/code&gt;: In cases where you have a Resolver class and legacy class that conflict on type arguments, use the Resolver class instead of throwing an error.&#10;Specifically this situation can occur when you have a graphql schema type &lt;code&gt;Foo&lt;/code&gt; with a &lt;code&gt;bars&lt;/code&gt; property and classes:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// legacy class you can&amp;#39;t change&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Foo&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Set&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Bar&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getBars&lt;/span&gt;() {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//...returns set of bars...&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// nice resolver that does what you want&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FooResolver&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;implements&lt;/span&gt; GraphQLResolver&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Foo&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Set&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;BarDTO&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getBars&lt;/span&gt;() {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ...converts Bar objects to BarDTO objects and returns set...&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You will now have the code find two different return types for getBars() and application will not start with the error &lt;code&gt;Caused by: graphql.kickstart.tools.SchemaClassScannerError: Two different classes used for type&lt;/code&gt;&#10;If this property is true it will ignore the legacy version.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;addProxyHandler&lt;/code&gt;: If your runtime resolver classes are auto-generated proxies of some kind you can provide a handler to help the parser find the real resolvers behind them. Four proxy handlers are provided by default for these libraries:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Javassist&lt;/li&gt;&#10;&lt;li&gt;Guice&lt;/li&gt;&#10;&lt;li&gt;Spring AOP&lt;/li&gt;&#10;&lt;li&gt;Weld&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;A resolver that is a JDK dynamic proxy fails the build, since its methods can&amp;rsquo;t be called on the proxy. Use class-based proxies, e.g. &lt;code&gt;proxyTargetClass = true&lt;/code&gt; in Spring.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;fieldVisibility&lt;/code&gt;: Provide a graphql field visibility implementation. See &lt;a href="https://www.graphql-java.com/documentation/field-visibility"&gt;Field Visibility&lt;/a&gt;.&#10;To turn introspection off, use graphql-java&amp;rsquo;s switches, for the whole JVM or for one request:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Introspection.&lt;span style="color:#a6e22e"&gt;enabledJvmWide&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; executionInput &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ExecutionInput.&lt;span style="color:#a6e22e"&gt;newExecutionInput&lt;/span&gt;()&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;query&lt;/span&gt;(query)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;graphQLContext&lt;/span&gt;(Map.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(Introspection.&lt;span style="color:#a6e22e"&gt;INTROSPECTION_DISABLED&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;));&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;coroutineContext&lt;/code&gt; / &lt;code&gt;coroutineContextProvider&lt;/code&gt;: Provide a kotlin coroutine context to be used with suspend functions of resolvers.&#10;A suspend function runs on the calling thread until it first suspends, and continues on this context after that, so wrap blocking calls in &lt;code&gt;withContext(Dispatchers.IO)&lt;/code&gt;.&#10;To run them in your own &lt;code&gt;CoroutineScope&lt;/code&gt;, e.g. to cancel them with the request, put it in the execution input&amp;rsquo;s context:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; executionInput &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ExecutionInput.&lt;span style="color:#a6e22e"&gt;newExecutionInput&lt;/span&gt;()&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;query&lt;/span&gt;(query)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;graphQLContext&lt;/span&gt;(Map.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(CoroutineScope.&lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;, scope));&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;typeDefinitionFactory&lt;/code&gt;: See &lt;a href="https://graphql-java-kickstart.github.io/tools/type-definition-factory/"&gt;Type Definition Factory&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;includeUnusedTypes&lt;/code&gt;: Defaults to &lt;code&gt;false&lt;/code&gt;. By default, the parser will ignore unused type definitions in the schema. Enable this option to include them regardless.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;allowUndeclaredDirectives&lt;/code&gt;: Defaults to &lt;code&gt;false&lt;/code&gt;. Allows applying directives that aren&amp;rsquo;t declared in the schema, e.g. the Apollo Federation directives imported through &lt;code&gt;@link&lt;/code&gt;. They&amp;rsquo;re only added as applied directives, with argument types guessed from their values. Directives with enum or input object arguments still have to be declared.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;unmappedInputFields&lt;/code&gt;: Defaults to &lt;code&gt;WARN&lt;/code&gt;. What to do about input type fields that the class of a resolver argument has no property for. When a client sends such a field, Jackson fails to convert the argument, or drops the value if the &lt;code&gt;ObjectMapper&lt;/code&gt; ignores unknown properties, like plain Jackson 3 and Spring Boot mappers do.&#10;The classes are checked when the schema is built, with each field&amp;rsquo;s &lt;code&gt;ObjectMapper&lt;/code&gt;, and &lt;code&gt;WARN&lt;/code&gt; logs a warning for each of these fields. &lt;code&gt;FAIL&lt;/code&gt; fails the build instead, and &lt;code&gt;IGNORE&lt;/code&gt; skips the check. To leave a field unmapped on purpose, add it to &lt;code&gt;@JsonIgnoreProperties&lt;/code&gt; on the class.&#10;Classes with a custom deserializer, a builder or a delegating creator aren&amp;rsquo;t checked, and neither are arguments bound to a &lt;code&gt;Map&lt;/code&gt; or a &lt;code&gt;JsonNode&lt;/code&gt;.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Relay</title><link>https://graphql-java-kickstart.github.io/tools/relay/</link><pubDate>Wed, 07 Nov 2018 00:11:02 +0100</pubDate><guid>https://graphql-java-kickstart.github.io/tools/relay/</guid><description>&lt;p&gt;Relay requires quite some boilerplate type definitions to be defined. They&#10;are all the same apart from type of the node the Relay connection targets.&#10;This results in schemas with a lot of duplication, like the following:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-graphql" data-lang="graphql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Query&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; users(first: &lt;span style="color:#a6e22e"&gt;Int&lt;/span&gt;, after: &lt;span style="color:#a6e22e"&gt;String&lt;/span&gt;): &lt;span style="color:#a6e22e"&gt;UserConnection&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; organizations(first: &lt;span style="color:#a6e22e"&gt;Int&lt;/span&gt;, after: &lt;span style="color:#a6e22e"&gt;String&lt;/span&gt;): &lt;span style="color:#a6e22e"&gt;OrganizationConnection&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UserConnection&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; edges: [UserEdge]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pageInfo: &lt;span style="color:#a6e22e"&gt;PageInfo&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UserEdge&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cursor: &lt;span style="color:#a6e22e"&gt;String&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; node: &lt;span style="color:#a6e22e"&gt;User&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PageInfo&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hasPreviousPage: &lt;span style="color:#a6e22e"&gt;Boolean&lt;/span&gt;!&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hasNextPage: &lt;span style="color:#a6e22e"&gt;Boolean&lt;/span&gt;!&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;User&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id: &lt;span style="color:#a6e22e"&gt;ID&lt;/span&gt;!&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name: &lt;span style="color:#a6e22e"&gt;String&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;OrganizationConnection&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; edges: [OrganizationEdge]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pageInfo: &lt;span style="color:#a6e22e"&gt;PageInfo&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;OrganizationEdge&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cursor: &lt;span style="color:#a6e22e"&gt;String&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; node: &lt;span style="color:#a6e22e"&gt;Organization&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Organization&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id: &lt;span style="color:#a6e22e"&gt;ID&lt;/span&gt;!&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="using-the-type-definition-factory"&gt;Using the Type Definition Factory&lt;/h2&gt;&#10;&lt;p&gt;In version 5.4 of &lt;code&gt;graphql-java-tools&lt;/code&gt; the&#10;&lt;a href="https://graphql-java-kickstart.github.io/tools/type-definition-factory/"&gt;Type Definition Factory&lt;/a&gt; has been&#10;introduced. This has been added with this particular use case in mind, but can&#10;be used for any type of definition that you&amp;rsquo;d want to add dynamically instead&#10;of defining it statically in the SDL.&lt;/p&gt;</description></item><item><title>Type Definition Factory</title><link>https://graphql-java-kickstart.github.io/spring-boot/type-definition-factory/</link><pubDate>Wed, 07 Nov 2018 00:11:02 +0100</pubDate><guid>https://graphql-java-kickstart.github.io/spring-boot/type-definition-factory/</guid><description>&lt;p&gt;The &lt;strong&gt;Type Definition Factory&lt;/strong&gt; has been added with to be able to dynamically&#10;add type definitions to the schema instead of having to define them manually&#10;in the SDL. There are a couple of use cases where the types that have to be defined&#10;are very much alike and only certain parts are different. For example the&#10;connection and edge types used by &lt;a href="https://graphql-java-kickstart.github.io/tools/relay/"&gt;Relay&lt;/a&gt;. Since generics isn&amp;rsquo;t supported in&#10;the definition language this type definition factory has been added.&lt;/p&gt;</description></item><item><title>Type Definition Factory</title><link>https://graphql-java-kickstart.github.io/tools/type-definition-factory/</link><pubDate>Wed, 07 Nov 2018 00:11:02 +0100</pubDate><guid>https://graphql-java-kickstart.github.io/tools/type-definition-factory/</guid><description>&lt;p&gt;The &lt;strong&gt;Type Definition Factory&lt;/strong&gt; has been added to allow to dynamically&#10;add type definitions to the schema instead of having to define them manually&#10;in the SDL. There are a couple of use cases where the types that have to be defined&#10;are very much alike and only certain parts are different. For example the&#10;connection and edge types used by &lt;a href="https://graphql-java-kickstart.github.io/tools/relay/"&gt;Relay&lt;/a&gt;. Since generics aren&amp;rsquo;t supported in&#10;the definition language this type definition factory has been added.&lt;/p&gt;</description></item><item><title>Directives</title><link>https://graphql-java-kickstart.github.io/spring-boot/directives/</link><pubDate>Wed, 07 Nov 2018 00:11:02 +0100</pubDate><guid>https://graphql-java-kickstart.github.io/spring-boot/directives/</guid><description>&lt;p&gt;See &lt;a href="https://www.graphql-java.com/documentation/v16/sdl-directives/"&gt;Schema Directives&lt;/a&gt;&#10;for a detailed explanation about directives including examples on how to define&#10;them in the SDL and to create the required classes.&lt;/p&gt;&#10;&lt;p&gt;To add your custom &lt;code&gt;SchemaDirectiveWiring&lt;/code&gt; to &lt;code&gt;graphql-spring-boot&lt;/code&gt; create a bean&#10;of type &lt;code&gt;SchemaDirective&lt;/code&gt; to have it automatically passed along to the &lt;code&gt;SchemaParser&lt;/code&gt;&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;SchemaDirective.create(&amp;#34;uppercase&amp;#34;, new UppercaseDirective())&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="basic-usage"&gt;Basic usage&lt;/h2&gt;&#10;&lt;p&gt;Let&amp;rsquo;s say you defined a custom directive to make text uppercase in a resource &lt;code&gt;schema.graphqls&lt;/code&gt;:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;directive @uppercase on FIELD_DEFINITION&#10;&#10;type Query {&#10; hello: String @uppercase&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And the actual implementation is the following:&lt;/p&gt;</description></item><item><title>Directives</title><link>https://graphql-java-kickstart.github.io/tools/directives/</link><pubDate>Wed, 07 Nov 2018 00:11:02 +0100</pubDate><guid>https://graphql-java-kickstart.github.io/tools/directives/</guid><description>&lt;p&gt;See &lt;a href="https://www.graphql-java.com/documentation/directives"&gt;Schema Directives&lt;/a&gt;&#10;for a detailed explanation about directives including examples on how to define&#10;them in the SDL and to create the required classes.&lt;/p&gt;&#10;&lt;p&gt;To add your custom &lt;code&gt;SchemaDirectiveWiring&lt;/code&gt; to &lt;code&gt;graphql-java-tools&lt;/code&gt; pass it along&#10;when creating the &lt;code&gt;SchemaParser&lt;/code&gt; using&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;SchemaParser.newParser().directive(&amp;#34;name&amp;#34;, new MySchemaDirectiveWiring()).build()&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="basic-usage"&gt;Basic usage&lt;/h2&gt;&#10;&lt;p&gt;Let&amp;rsquo;s say you defined a custom directive to make text uppercase in a resource &lt;code&gt;schema.graphqls&lt;/code&gt;:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;directive @uppercase on FIELD_DEFINITION&#10;&#10;type Query {&#10; hello: String @uppercase&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And the actual implementation is the following:&lt;/p&gt;</description></item><item><title>Embedded Editors</title><link>https://graphql-java-kickstart.github.io/spring-boot/embedded-editors/</link><pubDate>Mon, 17 May 2021 07:00:00 -0500</pubDate><guid>https://graphql-java-kickstart.github.io/spring-boot/embedded-editors/</guid><description>&lt;p&gt;The following GraphQL Embedded Editors are bundled for convenience:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="#altair"&gt;Altair&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="#configuration-parameters"&gt;Configuration Parameters&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#graphql-playground"&gt;GraphQL Playground&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="#configuration-parameters-1"&gt;Configuration Parameters&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#graphiql"&gt;GraphiQL&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="#configuration-parameters-2"&gt;Configuration Parameters&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#graphql-voyager"&gt;GraphQL Voyager&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="#configuration-parameters-3"&gt;Configuration Parameters&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="altair"&gt;Altair&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/imolorhe/altair"&gt;Altair&lt;/a&gt; becomes accessible at the root &lt;code&gt;/altair&lt;/code&gt; if the &lt;code&gt;graphql.altair.enabled&lt;/code&gt; property is true.&lt;/p&gt;&#10;&lt;p&gt;Note that GraphQL server must be available at &lt;code&gt;/graphql/\*&lt;/code&gt; context to be discovered by Altair.&lt;/p&gt;&#10;&lt;h3 id="configuration-parameters"&gt;Configuration Parameters&lt;/h3&gt;&#10;&lt;p&gt;Available Spring Boot configuration parameters (either &lt;code&gt;application.yml&lt;/code&gt; or &lt;code&gt;application.properties&lt;/code&gt;):&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;graphql&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;altair&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;enabled&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mapping&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;/altair&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;subscriptions&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;timeout&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;reconnect&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;static&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;base-path&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;page-title&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Altair&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;cdn&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;enabled&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;4.0.2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;options&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;endpoint-url&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;/graphql&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;subscriptions-endpoint&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;/subscriptions&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;initial-settings&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;theme&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;dracula&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;initial-headers&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Authorization&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Bearer &amp;lt;your-token&amp;gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;resources&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;initial-query&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;defaultQuery.graphql&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;initial-variables&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;variables.graphql&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;initial-pre-request-script&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;pre-request.graphql&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;initial-post-request-script&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;post-request.graphql&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="graphql-playground"&gt;GraphQL Playground&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/prisma/graphql-playground"&gt;GraphQL Playground&lt;/a&gt; becomes accessible at root &lt;code&gt;/playground&lt;/code&gt; (or as configured in &lt;code&gt;graphql.playground.mapping&lt;/code&gt;) if the &lt;code&gt;graphql.playground.enabled&lt;/code&gt; property is true.&lt;/p&gt;</description></item><item><title>OSGi</title><link>https://graphql-java-kickstart.github.io/servlet/osgi/</link><pubDate>Fri, 15 May 2020 09:28:02 +0100</pubDate><guid>https://graphql-java-kickstart.github.io/servlet/osgi/</guid><description>&lt;p&gt;The &lt;a href="https://github.com/graphql-java-kickstart/graphql-java-servlet/blob/master/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/OsgiGraphQLHttpServlet.java"&gt;OsgiGraphQLHttpServlet&lt;/a&gt; uses a &amp;ldquo;provider&amp;rdquo; model to supply the servlet with the required objects:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/graphql-java-kickstart/graphql-java-servlet/blob/master/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/osgi/GraphQLQueryProvider.java"&gt;GraphQLQueryProvider&lt;/a&gt;: Provides query fields to the GraphQL schema.&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/graphql-java-kickstart/graphql-java-servlet/blob/master/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/osgi/GraphQLMutationProvider.java"&gt;GraphQLMutationProvider&lt;/a&gt;: Provides mutation fields to the GraphQL schema.&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/graphql-java-kickstart/graphql-java-servlet/blob/master/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/osgi/GraphQLTypesProvider.java"&gt;GraphQLTypesProvider&lt;/a&gt;: Provides type information to the GraphQL schema.&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/graphql-java-kickstart/graphql-java-servlet/blob/master/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/config/ExecutionStrategyProvider.java"&gt;ExecutionStrategyProvider&lt;/a&gt;: Provides an execution strategy for running each query.&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/graphql-java-kickstart/graphql-java-servlet/blob/master/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContextBuilder.java"&gt;GraphQLContextBuilder&lt;/a&gt;: Builds a context for running each query.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="examples"&gt;Examples&lt;/h2&gt;&#10;&lt;p&gt;You can now find some example on how to use graphql-java-servlet.&lt;/p&gt;&#10;&lt;h3 id="requirements"&gt;Requirements&lt;/h3&gt;&#10;&lt;p&gt;The OSGi examples use Maven as a build tool because it requires plugins that are not (yet) available for Gradle.&#10;Therefore you will need Maven 3.2+.&lt;/p&gt;</description></item></channel></rss>