Spring Boot 对Spring for GraphQL的支持

https://docs.spring.io/spring-boot/docs/3.2.0/reference/htmlsingle/#web.graphql

如果你想要构建GraphQL应用程序,你可以利用Spring Boot对Spring for GraphQL的自动配置。Spring for GraphQL项目基于GraphQL Java。你至少需要spring-boot-starter-graphql启动器。由于GraphQL与传输无关,你还需要在你的应用程序中有一个或多个额外的启动器,以便通过Web公开你的GraphQL API:

在这里插入图片描述

GraphQL Schema

Spring GraphQL应用程序在启动时需要一个定义的schema。默认情况下,你可以在src/main/resources/graphql/**下编写".graphqls"或".gqls" schema 文件,Spring Boot将自动加载它们。你可以使用spring.graphql.schema.locations自定义位置,使用spring.graphql.schema.file-extensions自定义文件扩展名。

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

在以下部分中,我们将考虑这个示例GraphQL模式,它定义了两个类型和两个查询:

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.enabled设置为false来禁用内省。

GraphQL RuntimeWiring

GraphQL Java的RuntimeWiring.Builder可用于注册自定义标量类型、指令、类型解析器、DataFetcher等。你可以在你的Spring配置中声明RuntimeWiringConfigurer bean,以访问RuntimeWiring.Builder。Spring Boot会检测到这样的bean,并将它们添加到GraphQlSource构建器中。

然而,通常情况下,应用程序不会直接实现DataFetcher,而是会创建带有注解的控制器。Spring Boot会自动检测到带有注解处理程序方法的@Controller类,并将它们注册为DataFetchers。下面是一个使用@Controller类的问候查询示例实现:

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 + "!";
    }

}

Querydsl和QueryByExample存储库支持

Spring Data支持Querydsl和QueryByExample存储库。Spring GraphQL可以将Querydsl和QueryByExample存储库配置为DataFetcher

Spring Boot会检测到使用@GraphQlRepository注解并且扩展了以下之一的Spring Data存储库:

  • QuerydslPredicateExecutor
  • ReactiveQuerydslPredicateExecutor
  • QueryByExampleExecutor
  • ReactiveQueryByExampleExecutor

并将它们视为与顶层查询匹配的数据提取器(DataFetcher)的候选者。

传输

HTTP和WebSocket

默认情况下,GraphQL HTTP端点位于HTTP POST /graphql。可以使用spring.graphql.path自定义路径。

提示:Spring MVC和Spring WebFlux的HTTP端点是由一个带有@Order注解且值为0RouterFunction bean提供的。如果你定义了自己的RouterFunction bean,你可能需要添加适当的@Order注解以确保它们能够正确排序。

GraphQL的WebSocket端点默认是关闭的。要启用它:

  • 对于Servlet应用程序,需要添加WebSocket启动器spring-boot-starter-websocket
  • 对于WebFlux应用程序,则不需要额外的依赖项;
  • 对于这两者,都必须设置应用程序属性spring.graphql.websocket.path

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

Spring MVC和Spring WebFlux支持CORS(跨源资源共享)请求。CORS是GraphQL应用程序的Web配置中非常重要的一个部分,它允许使用不同域名的浏览器访问GraphQL应用程序。

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

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

RSocket

RSocket也支持作为WebSocket或TCP上的传输层。一旦配置了RSocket服务器,就可以使用spring.graphql.rsocket.mapping在特定路由上配置我们的GraphQL处理程序。例如,将该映射配置为“graphql”意味着我们可以在使用RSocketGraphQlClient发送请求时将其作为路由使用。

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

@Component
public class RSocketGraphQlClientExample {

    private final RSocketGraphQlClient graphQlClient;

    public RSocketGraphQlClientExample(RSocketGraphQlClient.Builder<?> builder) {
        this.graphQlClient = builder.tcp("example.spring.io", 8181).route("graphql").build();
    }

然后发送请求:

Mono<Book> book = this.graphQlClient.document("{ bookById(id: \"book-1\"){ id name pageCount author } }")
    .retrieve("bookById")
    .toEntity(Book.class);

异常处理

Spring GraphQL允许应用程序注册一个或多个按顺序调用的Spring DataFetcherExceptionResolver组件。异常必须解析为graphql.GraphQLError对象的列表,Spring Boot将自动检测DataFetcherExceptionResolver bean,并将其与GraphQlSource.Builder一起注册。

GraphiQL 和 Schema printer

Spring GraphQL 为消费或开发 GraphQL API 的开发者提供了基础设施支持。

Spring GraphQL 默认附带了一个 GraphiQL 页面,该页面默认情况下暴露于 “/graphiql” 路径下。此页面默认是禁用的,可以通过设置 spring.graphql.graphiql.enabled 属性来启用它。许多暴露此类页面的应用程序会倾向于使用自定义构建。默认实现在开发过程中非常有用,因此,在开发过程中,它会与 spring-boot-devtools 一起自动暴露。

当启用 spring.graphql.schema.printer.enabled 属性时,你还可以选择在 /graphql/schema 路径下以文本格式暴露 GraphQL 模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值