如果要构建 GraphQL 应用程序,可以利用 Spring Boot 对 Spring for GraphQL 的自动配置。 Spring for GraphQL 项目基于 GraphQL Java。 您至少需要启动器。 由于 GraphQL 与传输无关,因此您还需要在应用程序中具有一个或多个其他启动器,以在 Web 上公开 GraphQL API:spring-boot-starter-graphqlSpring中文文档

起动机 运输 实现

spring-boot-starter-webSpring中文文档

HTTP的Spring中文文档

Spring MVCSpring中文文档

spring-boot-starter-websocketSpring中文文档

网络套接字Spring中文文档

用于 Servlet 应用程序的 WebSocketSpring中文文档

spring-boot-starter-webfluxSpring中文文档

HTTP、WebSocketSpring中文文档

Spring WebFluxSpring中文文档

spring-boot-starter-rsocketSpring中文文档

TCP、WebSocketSpring中文文档

Reactor Netty 上的 Spring WebFluxSpring中文文档

起动机 运输 实现

spring-boot-starter-webSpring中文文档

HTTP的Spring中文文档

Spring MVCSpring中文文档

spring-boot-starter-websocketSpring中文文档

网络套接字Spring中文文档

用于 Servlet 应用程序的 WebSocketSpring中文文档

spring-boot-starter-webfluxSpring中文文档

HTTP、WebSocketSpring中文文档

Spring WebFluxSpring中文文档

spring-boot-starter-rsocketSpring中文文档

TCP、WebSocketSpring中文文档

Reactor Netty 上的 Spring WebFluxSpring中文文档

GraphQL 架构

Spring GraphQL 应用程序在启动时需要定义的架构。 默认情况下,您可以在下写入“.graphqls”或“.gqls”模式文件,Spring Boot 将自动拾取它们。 您可以使用 自定义位置,也可以自定义文件扩展名。src/main/resources/graphql/**spring.graphql.schema.locationsspring.graphql.schema.file-extensionsSpring中文文档

如果您希望 Spring Boot 检测该位置的所有应用程序模块和依赖项中的架构文件, 您可以设置为(注意前缀)。spring.graphql.schema.locations"classpath*:graphql/**/"classpath*:

在以下各节中,我们将考虑此示例 GraphQL 架构,定义两种类型和两种查询:Spring中文文档

type Query {
    greeting(name: String! = "Spring"): String!
    project(slug: ID!): Project
}

""" A Project in the Spring portfolio """
type Project {
    """ Unique string id used in URLs """
    slug: ID!
    """ Project name """
    name: String!
    """ URL of the git repository """
    repositoryUrl: String!
    """ Current support status """
    status: ProjectStatus!
}

enum ProjectStatus {
    """ Actively supported by the Spring team """
    ACTIVE
    """ Supported by the community """
    COMMUNITY
    """ Prototype, not officially supported yet  """
    INCUBATING
    """ Project being retired, in maintenance mode """
    ATTIC
    """ End-Of-Lifed """
    EOL
}
默认情况下,将允许在架构上进行字段自省,因为这是 GraphiQL 等工具所必需的。 如果不希望公开有关架构的信息,可以通过设置为 来禁用自省。spring.graphql.schema.introspection.enabledfalse
如果您希望 Spring Boot 检测该位置的所有应用程序模块和依赖项中的架构文件, 您可以设置为(注意前缀)。spring.graphql.schema.locations"classpath*:graphql/**/"classpath*:
默认情况下,将允许在架构上进行字段自省,因为这是 GraphiQL 等工具所必需的。 如果不希望公开有关架构的信息,可以通过设置为 来禁用自省。spring.graphql.schema.introspection.enabledfalse

GraphQL 运行时接线

GraphQL Java 可用于注册自定义标量类型、指令、类型解析器等。 您可以在 Spring 配置中声明 bean 以访问 . Spring Boot 会检测此类 bean 并将它们添加到 GraphQlSource 构建器中。RuntimeWiring.BuilderDataFetcherRuntimeWiringConfigurerRuntimeWiring.BuilderSpring中文文档

但是,通常情况下,应用程序不会直接实现,而是创建带注释的控制器。 Spring Boot 将自动检测具有带注释的处理程序方法的类,并将其注册为 s。 下面是带有类的问候查询的示例实现:DataFetcher@ControllerDataFetcher@ControllerSpring中文文档

import org.springframework.graphql.data.method.annotation.Argument;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.stereotype.Controller;

@Controller
public class GreetingController {

	@QueryMapping
	public String greeting(@Argument String name) {
		return "Hello, " + name + "!";
	}

}
import org.springframework.graphql.data.method.annotation.Argument
import org.springframework.graphql.data.method.annotation.QueryMapping
import org.springframework.stereotype.Controller

@Controller
class GreetingController {

	@QueryMapping
	fun greeting(@Argument name: String): String {
		return "Hello, $name!"
	}

}

Querydsl 和 QueryByExample 存储库支持

Spring Data 提供对 Querydsl 和 QueryByExample 存储库的支持。 Spring GraphQL 可以将 Querydsl 和 QueryByExample 存储库配置为 DataFetcherSpring中文文档

Spring Data 存储库使用以下项之一进行注释和扩展:@GraphQlRepositorySpring中文文档

被 Spring Boot 检测到,并被视为匹配顶级查询的候选项。DataFetcherSpring中文文档

运输

HTTP 和 WebSocket

默认情况下,GraphQL HTTP 端点处于 HTTP POST 状态。 它还仅支持订阅的服务器发送事件上的媒体类型。 可以使用 自定义路径。/graphql"text/event-stream"spring.graphql.pathSpring中文文档

Spring MVC 和 Spring WebFlux 的 HTTP 端点由一个 be 提供。 如果您定义了自己的 Bean,则可能需要添加适当的注释以确保正确排序。RouterFunction@Order0RouterFunction@Order

默认情况下,GraphQL WebSocket 端点处于关闭状态。要启用它,请执行以下操作:Spring中文文档

  • 对于 Servlet 应用程序,请添加 WebSocket 启动器spring-boot-starter-websocketSpring中文文档

  • 对于 WebFlux 应用程序,不需要额外的依赖项Spring中文文档

  • 对于两者,必须设置应用程序属性spring.graphql.websocket.pathSpring中文文档

Spring GraphQL 提供了一个 Web 拦截模型。 这对于从 HTTP 请求标头中检索信息并将其设置在 GraphQL 上下文中或从同一上下文中获取信息并将其写入响应标头非常有用。 使用 Spring Boot,您可以声明一个 bean 以将其注册到 Web 传输中。WebInterceptorSpring中文文档

Spring MVCSpring WebFlux 支持 CORS(跨域资源共享)请求。 CORS 是 GraphQL 应用程序 Web 配置的关键部分,这些应用程序可从使用不同域的浏览器访问。Spring中文文档

Spring Boot 支持命名空间下的许多配置属性;下面是一个简短的配置示例:spring.graphql.cors.*Spring中文文档

spring.graphql.cors.allowed-origins=https://example.org
spring.graphql.cors.allowed-methods=GET,POST
spring.graphql.cors.max-age=1800s
spring:
  graphql:
    cors:
      allowed-origins: "https://example.org"
      allowed-methods: GET,POST
      max-age: 1800s

RSocket

RSocket 也支持作为 WebSocket 或 TCP 之上的传输。 配置 RSocket 服务器后,我们可以使用 . 例如,将该映射配置为意味着我们可以在使用 .spring.graphql.rsocket.mapping"graphql"RSocketGraphQlClientSpring中文文档

Spring Boot 会自动配置一个可以注入组件的 bean:RSocketGraphQlClient.Builder<?>Spring中文文档

@Component
public class RSocketGraphQlClientExample {

	private final RSocketGraphQlClient graphQlClient;

	public RSocketGraphQlClientExample(RSocketGraphQlClient.Builder<?> builder) {
		this.graphQlClient = builder.tcp("example.spring.io", 8181).route("graphql").build();
	}
@Component
class RSocketGraphQlClientExample(private val builder: RSocketGraphQlClient.Builder<*>) {

然后发送请求: 包含代码::RSocketGraphQlClientExample[标签=请求]Spring中文文档

Spring MVC 和 Spring WebFlux 的 HTTP 端点由一个 be 提供。 如果您定义了自己的 Bean,则可能需要添加适当的注释以确保正确排序。RouterFunction@Order0RouterFunction@Order

异常处理

Spring GraphQL 使应用程序能够注册按顺序调用的一个或多个 Spring 组件。 异常必须解析为对象列表,请参阅 Spring GraphQL 异常处理文档。 Spring Boot 将自动检测 bean 并将它们注册到 .DataFetcherExceptionResolvergraphql.GraphQLErrorDataFetcherExceptionResolverGraphQlSource.BuilderSpring中文文档

GraphiQL 和 Schema 打印机

Spring GraphQL 提供了帮助开发人员使用或开发 GraphQL API 的基础架构。Spring中文文档

Spring GraphQL 附带默认的 GraphiQL 页面,默认情况下会公开该页面。 默认情况下,此页面处于禁用状态,可以使用该属性将其打开。 许多公开此类页面的应用程序将更喜欢自定义生成。 默认实现在开发过程中非常有用,这就是为什么在开发过程中它会使用 spring-boot-devtools 自动公开的原因。"/graphiql"spring.graphql.graphiql.enabledSpring中文文档

还可以选择在启用属性时以文本格式公开 GraphQL 架构。/graphql/schemaspring.graphql.schema.printer.enabledSpring中文文档