1. 执行mvn archetype:generate
可以选择模板(但是已有的模板往往跟不上技术的进步),也可以只是生成一个基本的Maven项目。
2. 编辑生成的pom.xml文件,使之首先支持Spring Boot特性
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
3. 创建SpringBootApplication应用入口类
@SpringBootApplication
public class Eris4jApplication {
public static void main(String[] args) {
SpringApplication.run(GraphQLjApplication.class, args);
}
}
4. 编辑pom.xml文件,使之支持GraphQL服务特性
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-spring-boot-starter</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphiql-spring-boot-starter</artifactId>
<version>4.0.0</version>
</dependency>
注意,graphql-spring-boot依赖于graphql-java。虽然目前graphql-java的最新版本是8.0,但是graphql-spring-boot 4.0.0项目不支持。如果结合graphql-java 8.0与graphql-spring-boot 4.0.0,将在启动GraphQL服务器时将抛出如下异常:
java.lang.ClassNotFoundException: graphql.execution.instrumentation.NoOpInstrumentation
原因是NoOpInstrumentation类只存在于graphql-java 7.0及以前版本,graphql-java 8.0中已经不存在了。
另外,graphql-spring-boot还依赖于graphql-java-servlet,以提供Web访问的URI endpoints,默认为http://localhost:8080/graphql/。,我们后续将介绍graphql-java-servlet。
注意,对graphiql-spring-boot-starter的依赖,使得我们测试可以访问http://localhost:8080/graphiql/
5. 定义可执行的GraphQLSchema对象,并使用@Bean将其标注为Spring bean
1) 可以直接创建GraphQLSchema对象,如下所示:
@Bean
GraphQLSchema schema() {
String schema = "type Query {hello: String}";
SchemaParser schemaParser = new SchemaParser();
TypeDefinitionRegistry typeDefinitionRegistry = schemaParser.parse(schema);
RuntimeWiring runtimeWiring = newRuntimeWiring()
.type("Query", builder -> builder.dataFetcher("hello", new StaticDataFetcher("Xiangbin")))
.build();
SchemaGenerator schemaGenerator = new SchemaGenerator();
return schemaGenerator.makeExecutableSchema(typeDefinitionRegistry, runtimeWiring);
2) 也可以使用graphql-java-tools,利用其中的GraphQLResolver和GraphQLScalar动态创建GraphQLSchema对象。
这时,graphql-java-tools将读取classpath下所有以*.graphqls为后缀名的文件,创建GraphQLSchema对象。具体*.graphqls文件的定义,请参考GraphQL规范。
6. 启动Spring Boot应用,使得GraphQL服务器就绪
启动Spring Boot应用的方法主要有两种,一种是在IDE中,执行run应用GraphQLApplication,另一种是在命令行中,执行java -jar target/myProjectName.jar。
GraphQL服务启动后,其URI默认为http://localhost:8080/graphql/,当然也可以在Spring Boot的application.properties配置文件中配置如下,改变其默认URI:
graphql.servlet.mapping=/mygraphql
7. 打开浏览器访问GraphQL服务
1) GET请求GraphQL服务器的Schema
http://localhost:8080/graphql/schema.json
2) POST请求查询具体的数据
http://localhost:8080/graphql{"query":"{hello}"}