该版本仍在开发中,尚未被视为稳定。对于最新稳定版本,请使用 Spring GraphQL 2.0.0spring-doc.cadn.net.cn

GraalVM 原生支持

Spring Framework 6.0 引入了将 Spring 应用程序编译为 GraalVM 原生镜像的支持基础设施。 如果你对 GraalVM 不熟悉,了解一下它与 JVM 上部署的应用有何不同,以及它对 Spring 应用意味着什么, 请参阅专门的 Spring Boot 3.x GraalVM 原生映像支持文档。 Spring Boot 还记录了 Spring 中 GraalVM 支持的已知限制spring-doc.cadn.net.cn

GraphQL Java 元数据

由于你的应用静态分析是在构建时进行的, 如果你的应用在运行时查找静态资源、进行反射或创建 JDK 代理,GraalVM 可能需要额外的提示。spring-doc.cadn.net.cn

GraphQL Java 在运行时执行三项本地映像合理执行的任务:spring-doc.cadn.net.cn

  1. 用于消息国际化的加载资源包spring-doc.cadn.net.cn

  2. 关于模式检查的内部类型的一些反思spring-doc.cadn.net.cn

  3. 对应用在模式中注册的Java类型进行反射。例如,当 GraphQL Java 从应用程序类型获取属性时,就会发生这种情况spring-doc.cadn.net.cn

前两项通过Spring团队贡献给GraalVM可达性元数据库的可达性元数据来处理。 当构建依赖 GraphQL Java 的应用程序时,原生编译工具会自动获取这些元数据。 这还没有涵盖我们列表中的第三项,因为这些类型是由应用程序本身提供的,必须通过其他方式发现。spring-doc.cadn.net.cn

原生服务器应用支持

在典型的Spring TGraphQL应用中,与GraphQL模式绑定的Java类型会被暴露在@Controller方法签名 作为参数或返回类型。在构建的提前处理阶段, Spring 或 GraphQL 会使用o.s.g.data.method.annotation.support.SchemaMappingBeanFactoryInitializationAotProcessor去发现 相应地,记录相关类型并注册可达性元数据。 如果你是在构建支持 GraalVM 的 Spring Boot 应用,这些都是自动完成的。spring-doc.cadn.net.cn

如果你的应用程序是“手动”注册数据获取器,某些类型因此无法被发现。 然后你应该把它们注册到 Spring Framework 的系统@RegisterReflectionForBinding:spring-doc.cadn.net.cn

import graphql.schema.DataFetcher;

import org.springframework.aot.hint.annotation.RegisterReflectionForBinding;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.graphql.data.query.QuerydslDataFetcher;
import org.springframework.graphql.execution.RuntimeWiringConfigurer;

@Configuration
@RegisterReflectionForBinding(Book.class) (3)
public class GraphQlConfiguration {

	@Bean
	RuntimeWiringConfigurer customWiringConfigurer(BookRepository bookRepository) { (1)
		DataFetcher<Book> dataFetcher = QuerydslDataFetcher.builder(bookRepository).single();
		return (wiringBuilder) -> wiringBuilder
				.type("Query", (builder) -> builder.dataFetcher("book", dataFetcher)); (2)
	}

}
1 该应用声明RuntimeWiringConfigurer“手动”会添加一个数据费彻
2 通过这个数据费彻书库将暴露类型
3 @RegisterReflectionForBinding将注册相关的提示类型以及所有类型作为场外开放

客户支持

GraphQl客户端在应用上下文中不一定以豆子形式存在,也不会在方法签名中暴露模式中使用的 Java 类型。 这《进攻的巨人》处理器上述所述策略无法作为结果使用。 对于客户端支持,Spring for GraphQL 嵌入了客户端基础设施相关的可达性元数据。 在应用程序使用的 Java 类型方面,应用应采用类似“手动”数据获取者的策略,使用@RegisterReflectionForBinding:spring-doc.cadn.net.cn

import reactor.core.publisher.Mono;

import org.springframework.aot.hint.annotation.RegisterReflectionForBinding;
import org.springframework.graphql.client.GraphQlClient;
import org.springframework.stereotype.Component;

@Component
@RegisterReflectionForBinding(Project.class) (2)
public class ProjectService {

	private final GraphQlClient graphQlClient;

	public ProjectService(GraphQlClient graphQlClient) {
		this.graphQlClient = graphQlClient;
	}

	public Mono<Project> project(String projectSlug) {
		String document = """
				query projectWithReleases($projectSlug: ID!) {
					project(slug: $projectSlug) {
						name
						releases {
							version
						}
					}
				}
				""";

		return this.graphQlClient.document(document)
				.variable("projectSlug", projectSlug)
				.retrieve("project")
				.toEntity(Project.class); (1)
	}
}
1 在原生图像中,我们需要确保可以对 进行反射项目运行时
2 @RegisterReflectionForBinding将注册相关的提示项目类型以及所有类型作为场外开放