对于最新的稳定版本,请使用Spring GraphQL 2.0.2spring-doc.cadn.net.cn

GraalVM Native 支持

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

GraphQL Java 元数据

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

GraphQL Java 在运行时执行三项任务,Native Image 会对此敏感: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 for GraphQL应用中,与GraphQL模式绑定的Java类型通常会在@Controller方法签名中以参数或返回值的形式暴露。 在构建过程中的提前编译处理阶段,Spring或GraphQL会使用其o.s.g.data.method.annotation.support.SchemaMappingBeanFactoryInitializationAotProcessor 来发现相关类型并相应地注册可达性元数据。 如果你正在使用GraalVM支持的Spring Boot应用进行构建,这一切都会自动完成。spring-doc.cadn.net.cn

如果您的应用程序是“手动”注册数据获取器,某些类型将无法被自动发现。 您应该使用Spring框架的1来手动进行注册: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,手动添加一个DataFetcher
2 通过这个DataFetcherBookRepository将暴露一种Book类型
3 @RegisterReflectionForBinding 将注册与 Book 类型以及所有作为字段暴露的类型相关的提示

客户端支持

The GraphQlClient不一定存在于应用上下文中作为bean,并且它不暴露在模式中的Java类型的方法签名中。 上述部分中描述的AotProcessor策略不能用作结果。 为了客户端支持,Spring for GraphQL嵌入了相关的可达性元数据以供客户端基础设施使用。 对于应用程序使用的Java类型,应用应该采用与“手动”数据获取器类似的方法,使用@RegisterReflectionForBindingspring-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 在原生镜像中,我们需要确保可以在运行时对 Project 执行反射操作。
2 @RegisterReflectionForBinding 将注册与 Project 类型以及所有作为字段暴露的类型相关的提示