Spring for GraphQL

如果你想构建 GraphQL 应用程序,可以利用 Spring Boot 对 Spring for GraphQL 的自动配置功能。 Spring for GraphQL 项目基于 GraphQL Java 开发。 你需要Spring-boot-starter-graphQL至少要先有个初始权。 由于 GraphQL 不依赖于传输,你还需要在应用中添加一个或多个额外的起始程序,以便通过网络发布 GraphQL API:spring-doc.cadn.net.cn

起动机 运输 实现

Spring Boot启动网spring-doc.cadn.net.cn

HTTPspring-doc.cadn.net.cn

春季MVCspring-doc.cadn.net.cn

Spring Boot启动网页接口spring-doc.cadn.net.cn

WebSocketspring-doc.cadn.net.cn

适用于 Servlet 应用的 WebSocketspring-doc.cadn.net.cn

Spring BootStarters网流spring-doc.cadn.net.cn

HTTP,WebSocketspring-doc.cadn.net.cn

春季网络流spring-doc.cadn.net.cn

Spring Boot器启动spring-doc.cadn.net.cn

TCP,WebSocketspring-doc.cadn.net.cn

Reactor Netty 上的 Spring WebFluxspring-doc.cadn.net.cn

GraphQL 模式

Spring GraphQL 应用程序启动时需要定义的模式。 默认情况下,你可以在下面写入“.graphqls”或“.gqls”模式文件src/main/resources/graphql/**而Spring靴会自动拾取它们。 你可以自定义地点spring.graphql.schema.locations以及文件扩展名spring.graphql.schema.file-extensions.spring-doc.cadn.net.cn

如果你想让 Spring Boot 检测该位置所有应用模块和依赖中的模式文件, 你可以设置spring.graphql.schema.locations“classpath*:graphQL/**/”(注意classpath*:前缀)。

在接下来的章节中,我们将考虑这个示例 GraphQL 模式,定义两种类型和两种查询:spring-doc.cadn.net.cn

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.

GraphQL 运行连接

The GraphQL Java运行时Wiring.Builder可用于注册自定义标量类型、指令、类型解析器,数据费彻,以及更多。 你可以申报RuntimeWiringConfigurer在你的 Spring 配置中获取 Beans 以获取运行时Wiring.Builder. Spring Boot 检测到这些豆子并将它们添加到 GraphQlSource 构建器中。spring-doc.cadn.net.cn

然而,通常应用程序不会实现数据费彻直接生成带注释的控制器。 Spring Boot 会自动检测@Controller带有注释处理方法的类,并将其注册为数据费彻s. 这里有一个我们问候查询的示例实现,包含@Controller类:spring-doc.cadn.net.cn

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 仓库支持

运输

HTTP 和 WebSocket

GraphQL 的 HTTP 端点位于 HTTP POST/graphql默认。 它还支持“文本/事件流”媒体类型覆盖服务器发送事件,仅限订阅用户。 路径可以自定义为Spring.graphQL.http.path.spring-doc.cadn.net.cn

Spring MVC 和 Spring WebFlux 的 HTTP 端点均由路由器功能带有@Order0. 如果你定义了自己的路由器功能豆子,你可能想加点合适的@Order注释以确保它们正确排序。

GraphQL WebSocket 端点默认关闭。启用它:spring-doc.cadn.net.cn

Spring GraphQL 提供了 Web 拦截模型。 这对于从HTTP请求头获取信息并将其置于GraphQL上下文中非常有用,或者从同一上下文获取信息并写入响应头部。 使用 Spring Boot,你可以声明WebGraphQl拦截器Bean希望它能在网络运输系统注册。spring-doc.cadn.net.cn

Spring MVCSpring WebFlux 支持 CORS(跨起源资源共享)请求。 CORS 是从 GraphQL 应用访问时,网络配置中的关键部分,这些应用可通过不同域的浏览器访问。spring-doc.cadn.net.cn

Spring Boot 支持许多配置属性,以下为春.graphql.cors.*Namespace;这里有一个简短的配置示例:spring-doc.cadn.net.cn

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服务器配置好,我们可以用以下方式在特定路由上配置GraphQL处理程序spring.graphql.rsocket.mapping. 例如,将该映射配置为“GraphQL”这意味着我们可以用它作为发送请求时的路由,RSocketGraphQlClient.spring-doc.cadn.net.cn

Spring Boot 会自动配置 aRSocketGraphQlClient.Builder<?>你可以注入组件的豆子:spring-doc.cadn.net.cn

@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<*>) {

然后发送请求: include-code::RSocketGraphQlClientExample[tag=request]spring-doc.cadn.net.cn

异常处理

Spring GraphQL 允许应用程序注册一个或多个 SpringDataFetcherExceptionResolver这些组件是顺序调用的。 该例外必须解析为以下列表GraphQLError对象,请参见 Spring GraphQL 的异常处理文档。 Spring Boot 会自动检测DataFetcherExceptionResolver并向GraphQLSource.Builder.spring-doc.cadn.net.cn

GraphiQL 和模式打印机

Spring GraphQL 为开发者在使用或开发 GraphQL API 时提供了基础设施。spring-doc.cadn.net.cn

Spring GraphQL 自带一个默认的 GraphiQL 页面,显示于“/graphiql”默认。 此页面默认被禁用,可以通过spring.graphql.graphiql.enabled财产。 许多暴露此类页面的应用程序会更倾向于自定义构建。 默认实现在开发过程中非常有用,这也是为什么它会被自动暴露Spring-boot-devtools在开发过程中。spring-doc.cadn.net.cn

你也可以选择以文本格式暴露 GraphQL 模式,地址为/graphql/schemaspring.graphql.schema.printer.enabled属性已启用。spring-doc.cadn.net.cn